我正在尝试在 C 中使用 sscanf 函数,但它不读取格式是必需的,我已经阅读了该函数的文档并遵循了示例,但它对我来说仍然效果不佳,因此我想要一些建议..
int main() {
long int id;
float grade,age;
char name[40],city[40],country[40],line[100]="388891477\tItzel\tGardner\t21\t6\tIran\tTehran";
int read_items = sscanf(line,"%ld %*[\t] %[a-zA-Z -] %*[\t] %f %*[\t] %f %*[\t] %[a-zA-Z -] %*[\t] %[a-zA-Z -]",
&id,name,&age,&grade,country,city);
printf("readed line is: %ld %s %f %f %s %s. sscanf() read %d items\n",id,name,grade,age,country,city,read_items);
}
当前输出:
readed line is: 3888914775 0.000000 0.000000 @�'�. sscanf() read 1 items
预期输出:
readed line is: 3888914775 Itzel Gardner 21.000000 26.000000 Iran Tehran. sscanf() read 6 items
另一个编辑:
问题要求是添加制表符,因此如果输入中有空格,它应该返回此输入不正确并且不应读取它,这就是我添加制表符的主要原因,因此它只能读取具有制表符的输入在其中,例如,如果 id 和 name 之间的输入只有 1 个空格,则不应读取它。抱歉让大家感到困惑
所以在行[100]="3888914775 Itzel Gardner 21 26 Iran Tehran";
输入之间的分隔输入只能是制表符(不能是一两个空格..)
正确输入示例:
line[100]="388891477\tItzel\tGardner\t21\t6\tIran\tTehran";
请您参考如下方法:
据我所知,您的代码存在一些问题。
首先,%*[\t]
说明符会造成干扰,因此没有必要。 sscanf
中说明符之间的空格将导致所有空格被消耗。
其次,您拥有的 ID 值可能会溢出 long int
,因此您可能需要使用 long long
而不是 %lld
说明符。
最后,似乎有些混淆是空格还是制表符分隔字段。空格是所有字符串字段的有效值,但也在字段之间给出。您的评论提到了制表符,但我在您的 line
字符串中没有看到任何内容。如果您使用制表符分隔您的字段,事情会好得多,因为制表符不是您的说明符集的一部分。
这是我对您的代码的更新,更正了上述所有内容:
#include <stdio.h>
int main() {
long long id;
float grade,age;
char name[40],city[40],country[40],line[100]="3888914775\tItzel Gardner\t21\t26\tIran\tTehran";
int read_items = sscanf(line,"%lld %[a-zA-Z -] %f %f %[a-zA-Z -] %[a-zA-Z -]",
&id,name,&age,&grade,country,city);
printf("readed line is: %lld %s %f %f %s %s. sscanf() read %d items\n",id,name,grade,age,country,city,read_items);
}
输出:
readed line is: 3888914775 Itzel Gardner 26.000000 21.000000 Iran Tehran. sscanf() read 6 items