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