繁体   English   中英

此文本文件上的fscanf()错误?

[英]fscanf() error on this text file?

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()匹配“ blue”。

我应该如何正确使var变成蓝色? 谢谢。

如何使用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);

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

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

实现您想要的。

您有一个错误,当您应将指向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()为止。

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

使用正则表达式

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);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM