test.txt:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
ccccccccccccccccccccccccccccccccccc
The color of the car is blue
代码:
FILE *fp;
char var[30];
int result
if( (fp = fopen( "test.txt", "r")) == NULL) //open for read
printf("ERROR");
result = fscanf( fp, "The color of the car is %s", &var);
执行此操作后:
打开文件(非NULL并且能够在测试时执行追加)
result = 0 //零 - 在匹配失败的情况下....? errno = 0;
而var是垃圾。
我期待fscanf()匹配“蓝色”。
我应该如何正确地将蓝色变成var? 谢谢。
答案 0 :(得分:4)
如何使用fgets
代替:
char *search = "The color of the..";
char *p;
while (fgets(var, SIZE, stdin)) {
/* Does it have what we want ? */
if ((p = strstr(var, search)))
break;
}
if (p)
p += strlen(str);
答案 1 :(得分:1)
Fscanf不能像这样工作。它不会环顾四周,也不会扫描字符串以寻找匹配的东西。您必须提供与格式说明符匹配的完全字符串。所以你可以做像
这样的事情result = fscanf(fp, "aaaaaaaaaaaaa\nbbbbbbbbbbb\ncccccccccc\nThe color of the car is %s", &var);
实现你想要的目标。
答案 2 :(得分:1)
当你传入一个指向char的指针时,你有一个错误,你将指向char数组的指针传递给fscanf
。碰巧的是,数组的地址等于数组的第一个元素的地址,所以它在事故中起作用。但是,传递了错误的类型。
此外,您希望找到为您提供匹配的行,并且您似乎希望将"blue"
存储到var
中。为此,您应该测试一行输入是否与您的扫描模式匹配。您可以使用fgets
读取一行,并使用sscanf
扫描该行。
while (fgets(buf, sizeof(buf), fp) != 0) {
result = sscanf(buf, "The color of the car is %s", var);
if (result == 1) break;
}
sscanf
将返回成功扫描的指令数。在这种情况下,有一个%s
指令。
这样做可以防止扫描错误“干扰”您的输入解析。也就是说,如果fscanf
返回错误,则在您致电clearerr()
之前,它将无法移过导致错误的输入。
答案 3 :(得分:1)
你还有另外一个错误,如果test.txt不存在,你的代码将会继续使用fscanf,这样你的检查就没用了。这几乎肯定会导致程序崩溃。
答案 4 :(得分:1)
使用正则表达式
char p[100];
char q[100];
char r[100];
fscanf(fp, "%[^\n]\n%[^\n]\n%[^\n]\nThe color of the car is %s",p,q,r, &var);
根据您的要求进行修改。我知道这不是你的实际字符串。