我有一些关于编程类(class)的作业,我正在学习 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]"
据我所知,您所关心的只是一系列字符,而不是制表符。
关于c - sscanf 如何读取直到空格、制表符或换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58684977/