#include <stdio.h>
int main()
{
printf("%d",scanf("ABC"));
return 0;
}
当我尝试运行时,其输出为-1。理想情况下应该不会给出错误吗?
答案 0 :(得分:1)
如果在输入结束之前到达输入结束,则返回EOF值。 第一次成功转换或匹配失败。
如果发生读取错误,也会返回EOF
答案 1 :(得分:0)
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”,{0}的scanf("ABC")
结果与预期的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 <�>
没有进入信号,然后立即发出文件结束信号,则预期的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
答案 2 :(得分:-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()
函数都不需要产生任何错误消息。