0

测试.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 并且在测试时能够执行追加)
结果 = 0 //zero- 在匹配失败的情况下......?
错误号 = 0;
var 是垃圾。

我期待 fscanf() 匹配“蓝色”。

我应该如何正确地将蓝色变为 var?谢谢你。

4

5 回答 5

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);
于 2012-08-28T20:32:32.027 回答
1

这里还有另一个错误,如果 test.txt 不存在,您的代码将继续使用 fscanf ,使您的检查无用。这几乎肯定会导致程序崩溃。

于 2012-08-28T20:48:56.317 回答
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);

根据您的要求进行修改。我知道这不是你的实际字符串。

于 2012-08-28T20:50:28.737 回答
1

Fscanf 不是这样工作的。它不会环顾四周,也不会扫描字符串以查找要匹配的内容。您必须提供与格式说明符完全匹配的字符串。所以你可以做类似的事情

result = fscanf(fp, "aaaaaaaaaaaaa\nbbbbbbbbbbb\ncccccccccc\nThe color of the car is %s", &var);

达到你想要的。

于 2012-08-28T20:31:37.807 回答
1

你有一个错误fscanf,当你应该传递一个指向 char 的指针时,你将指针传递给一个 char 数组。碰巧数组的地址等于数组的第一个元素的地址,所以它是偶然的。但是,传入了错误的类型。

此外,您想找到为您提供匹配的行,并且您似乎想存储"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().

于 2012-08-28T20:42:38.203 回答