c - sscanf 如何读取直到空格、制表符或换行符

标签 c scanf

我有一些关于编程类(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/

相关文章:

c++ - 返回本地 char* 和 char[] 的不同行为

c - 对于整数数组 |a|和整数 |i|在 C 中,a[i] 给出与 i[a] 相同的结果

c结构: Input requires number line by line by hitting "enter" after each number

c - 从 C 字符串中提取 POST 参数

c++ - 向量化数学函数的免费/开源 C/C++ 库?

c - C 中的加密数组

c - scanf "%c"不读取 C 中的空格

c - 扫描文本迫使我进入下一行,以确认输入。对于特殊情况我可以阻止这种情况吗?

c - 在 C 中的 scanf() 之后转到上一行

c - malloc 链表时出现段错误