如何克隆“%99s”:fscanf(文件,“%d%99s”,& id,名称)== 2)

时间:2017-06-21 07:55:02

标签: c

test.c 扫描 file.txt 并打印给定ID的名称。
我想在file.txt中添加第3列

我也想问:

-vf%99s的含义是: == 2

file.txt(已添加新列)

while (fscanf(fff, "%d %99s", &id, name) == 2) {

test.c已修改为使用第3列(添加了char name2 [100];并且克隆了%99s)

结果:无效。 (编译:​​确定。但输出空(无))

1 name1 newcolumn1
2 name2 newcolumn2
3 name3 newcolumn3

2 个答案:

答案 0 :(得分:0)

必须是:while (fscanf(fff, "%d %99s %99s ", &id, name, name2) == 3) { ... },请注意== 3。 来自manpage of fscanf()

  

这些函数返回成功匹配和分配的输入项的数量,可以少于提供的数量,或者在早期匹配失败的情况下甚至为零。

另请注意,您的文件位于Linux根文件夹:/file.txt。你的意思是当前工作目录只有file.txt吗?

%99s表示fscanf将读取99个字符并添加一个终止NUL字符('\0'),这样您的缓冲区就不会溢出,因为它的大小为100。 此外,如果您希望始终通过%s向fscanf提供正确的缓冲区,则可以关注this explanation

答案 1 :(得分:0)

fscanf(fff, "%d %99s %99s", &id, name) == 2表示该程序必须只接受名称和名称2中的最多99个字符

现在fscanf返回一个int值,该值为输入接受并放入变量中。所以#include <stdio.h> int main(void) { char name[100]; char name2[100]; FILE *fff; int found = 0; int id; fff = fopen("/file.txt", "r"); if (fff == NULL) return -1; while ( fscanf(fff, "%d %99s %99s ", &id, name, name2) == 3 ) { if (id == 2) { printf("%s\n", name2); found = 1; break; } } fclose(fff); return 0; } 总是错误的,因为接受了3个输入。

fscanf condtion只是一个小心谨慎的安全措施(常见的习惯用法)。

现在正确的程序是:

export