我在编程课程上有一些作业,我正在C上这个学期,在使用sscanf
函数时遇到了一些麻烦。
该程序实际上应该以以下形式从用户那里接收一行学生的详细信息:
<ID> <NAME> <GRADE> <AGE> <COUNTRY> <CITY>
我们对每个字段的形式都有一些限制,例如ID字段必须为10位,并且不能以0开头。
输入的重要内容是:用户必须在用制表符(\ t)分隔的地方写他的详细信息。
因此,我尝试使用sscanf
将其拆分为多个字段。我以为如果使用[^\t\n ]
,它将“理解”这是一个字段。
问题出在sscanf
上,这是我对函数的使用:
// Parse his details
sscanf(line, "%[^\t\n]\t%[^\t\n ]\t%u\t%u\t%[\t\n ]\t%[\t\n]\t", tmpStudent.ID, tmpStudent.name,
&tmpStudent.grade, &tmpStudent.age, tmpStudent.country, tmpStudent.city);
但是当我运行程序时,ID变量“吃掉了”名称字段,并且名称字段留空。
我该如何克服这个问题?
谢谢。
[尝试使sscanf()
正确是一种艺术,我会尽可能避免。
但是这似乎对我有用:
int n = sscanf(line, "%[^\t]\t%[^\t]\t%u\t%u\t%[^\t]\t%[^\t]",
tmpStudent.ID,
tmpStudent.name,
&tmpStudent.grade,
&tmpStudent.age,
tmpStudent.country,
tmpStudent.city);
重要的是,始终检查sscanf()
的返回值以确保获得了所要的全部六个项目。
在此版本的格式字符串中,我添加了人工间距以使内容更易于阅读,您可以删除它们以供实际使用(当然),但这是基于制表符分隔所有内容的要求:
"%[^\t] \t %[^\t] \t %u \t %u \t %[^\t] \t %[^\t]"
据我所知,您所关心的只是一系列[[不是标签的字符。