#include <stdio.h>
int main()
{
printf("%d",scanf("ABC"));
return 0;
}
当我尝试运行时,输出为-1。它不应该理想地给出错误吗?
这里
printf("%d",scanf("ABC"));
scanf()
等待用户输入,如果用户输入不是EOF(通过在Linux上按CTRL + D或在Windows上按CTRL + Z发送EOF指示)和空文件,则返回zero
。并且返回值由printf()
打印。
正如我在下面强调的那样,即使在早期匹配失败的情况下,这个scanf("ABC")
也会返回0
。
从scanf()
手册页
返回值
这些函数返回成功匹配和分配的输入项的数量,这可以少于提供的数量,或者在早期匹配失败的情况下甚至为零。
如果在第一次成功转换或匹配失败发生之前达到输入结束,则返回值EOF。如果发生读取错误,也会返回EOF,在这种情况下,将设置流的错误指示符(请参阅ferror(3)),并设置errno指示错误。
它不应该理想地给出错误吗?不,请阅读scanf()
的语法,它是
int scanf(const char *format, ...);
它的第一个参数是const char*
类型,即scanf()
期望const char*
的第一个参数,第一个参数提供的是"ABC"
类型的char*
虽然你应该提供像%s
等一些格式说明符。
同样如评论中所述,当误用,滥用或以其他方式错误使用时,printf()
和scanf()
函数都不需要产生任何错误消息。
如果之前达到输入结束,则返回值EOF 要么是第一次成功转换,要么是匹配失败。 如果发生读取错误,也会返回EOF
printf("%d",scanf("ABC"));
的输出是多少?
让我们尝试一些稍微更丰富的测试:
int main() {
printf("%d\n",scanf("ABC"));
int ch = fgetc(stdin);
printf("%d <%c>\n",ch, ch);
}
输入“ABCD \ n”时,scanf("ABC")
结果为0,与预期的0输入说明符相匹配(没有匹配的说明符,因此没有转换),既没有结束文件也没有发生罕见的输入错误。 "ABC"
被消耗了。收到的下一个角色是'D'
。
0
68 <D>
输入“AB \ n”时,scanf("ABC")
结果为0,与预期的0输入说明符匹配。 "AB"
被消耗了。收到的下一个角色是'\n'
。
0
13 <
>
输入“xyz \ n”时,匹配的0输入说明符的scanf("ABC")
结果为0。没有消耗任何东西。收到的下一个角色是'x'
。
xyz
0
120 <x>
输入“Ayz \ n”时,匹配的0输入说明符的scanf("ABC")
结果为0。 "A"
被消耗了。收到的下一个角色是'y'
。
Ayz
0
121 <y>
输入“ABC”然后发出文件结尾信号,scanf("ABC")
结果为-1(在我的机器上为EOF
)与预期的0输入说明符相匹配,并检测到文件结尾。 "ABC"
被消耗了。收到的下一个角色不是角色,而是来自EOF
的fgetc()
。
ABC-1
-1 <�>
没有inpit,然后文件结束立即发出信号,scanf("ABC")
结果-1(在我的机器上为EOF
)与预期的0输入说明符相匹配,并检测到文件结束。没有消耗任何东西。收到的下一个角色不是角色,而是来自EOF
的fgetc()
。
-1
-1 <�>
当我尝试运行时,输出为-1。它不应该理想地给出错误吗?
否,因为没有错误,C通常不会发出错误消息。
根据输入,预期结果为0或-1(或者机器上EOF
的负值)。可能存在输入匹配失败和上面看到的结果。
使用scanf("ABC")
,如果匹配,则输入消耗,首先是'A'
,然后是'B'
等。请注意"A"
和其余的不是像*scanf()
那样的"%d"
说明符。如果没有发生文件结尾(或罕见的输入错误 - 键盘电缆断开等),则返回0,否则为EOF
。
如果在第一次转换(如果有)完成之前发生输入故障,则
fscanf
函数返回宏EOF
的值。否则,该函数返回分配的输入项的数量,如果早期匹配失败,则可以少于提供的数量,甚至为零。 C11dr§7.21.6.216
那么输入失败是什么?
如果输入项的长度为零,则指令的执行失败;除非文件结束,编码错误或读取错误阻止了流的输入,否则此条件是匹配失败,在这种情况下,它是输入失败。 §7.21.6.29