scanf(“%*s”)会失败吗?

scanf(“%*s”)会失败吗?,c,C,我想写一个计算文本文件字数的C程序。我使用下面的循环: while (fscanf(fp, "%*s") != EOF ) { count++; } fp指向一个文本文件。此fscanf()函数是否可能出现早期匹配故障?因为我认为它肯定会到达文件的末尾,所以!=EOF您的程序应按预期工作,因为fscanf(fp,%*s”)返回0,但输入失败时返回EOF。除非将输入流设置为宽方向并且存在编码错误,否则输入失败只会发生在文件结尾和读取错误时 fscanf(fp,“%*s”)从不返回1,因为

我想写一个计算文本文件字数的C程序。我使用下面的循环:

while (fscanf(fp, "%*s") != EOF ) {
    count++;
}

fp
指向一个文本文件。此
fscanf()
函数是否可能出现早期匹配故障?因为我认为它肯定会到达文件的末尾,所以
!=EOF

您的程序应按预期工作,因为
fscanf(fp,%*s”)
返回
0
,但输入失败时返回
EOF
。除非将输入流设置为宽方向并且存在编码错误,否则输入失败只会发生在文件结尾和读取错误时

fscanf(fp,“%*s”)
从不返回
1
,因为
*
导致在返回值中忽略输入匹配,因此只计算分配的转换值:

7.21.6.2
fscanf
功能

返回

如果在第一次转换(如果有)完成之前发生输入故障,则
fscanf
函数返回宏
EOF
的值。否则,该函数将返回分配的输入项的数量,如果早期匹配失败,该数量可以小于提供的数量,甚至可以为零

这可以通过以下程序进行验证:

#包括
int main(){
int res=scanf(“%*s”);
printf(“scanf(\“%*s\”)->%d\n”,res);
返回0;
}

我喜欢你的
==
比较<代码>=包含否定,这是心理解决的额外步骤。你不反对吗?;-)与我的新手相比,看到你的
==0
方法确实令人满意EOF。将
fscanf()
的返回值与预期值进行比较要安全得多,尤其是当至少存储了一个转换时。这个具体的例子是一个特例,因为只有2个值是可能的,但一般来说更多的值是可能的。还要注意这个函数是多么不友好:即使是非常精明的程序员也会犯一些错误。我必须彻底研究它,才能在我自己的C库中实现它,而魔鬼就在细节中。@chqrlie。
chqrlie$ ./scanf0 < /dev/null
scanf("%*s") -> -1
chqrlie$ echo 'test' | ./scanf0
scanf("%*s") -> 0
while (fscanf(fp, "%*s") == 0) {
    count++;
}