我在编程课程上有一些作业,这学期我要学习C,在使用sscanf
函数时遇到了一些麻烦。
该程序实际上应该从用户那里收到一行学生的详细信息,格式如下:
<ID> <NAME> <GRADE> <AGE> <COUNTRY> <CITY>
我们对每个字段的形式都有一些限制,比如ID字段必须是10位数字,并且不能以0开头。
输入的重要之处在于:用户必须在用制表符(\t(分隔的地方写下自己的详细信息
因此,我尝试使用sscanf
将其拆分为多个字段。我想如果我使用[^tn ]
,它就会"理解"这是一个字段。
问题是sscanf
,这里是我使用的函数:
// Parse his details
sscanf(line, "%[^tn]t%[^tn ]t%ut%ut%[tn ]t%[tn]t", tmpStudent.ID, tmpStudent.name,
&tmpStudent.grade, &tmpStudent.age, tmpStudent.country, tmpStudent.city);
但是当我运行程序时,ID变量"吃掉"名称字段,名称字段为空。
我该如何克服这个问题?
谢谢。
尝试正确处理sscanf()
是一门艺术,我会尽可能避免它。
但这似乎对我有效:
int n = sscanf(line, "%[^t]t%[^t]t%ut%ut%[^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]"
据我所知,你所关心的只是一系列而不是标签的字符。