printf( "%d" ,scanf( "ABC" ));的输出是什么?


#include <stdio.h>
int main()
{
printf("%d",scanf("ABC"));
return 0;
}

当我尝试运行时,它给出的输出为 -1。理想情况下,它不应该给出错误吗?

如果在
第一次成功转换或匹配失败之前到达输入终点,则返回值 EOF。
如果发生读取错误,也会返回 EOF

printf("%d",scanf("ABC"));的输出是什么?

让我们尝试一些信息量更大的测试:

int main() {
printf("%dn",scanf("ABC"));
int ch =   fgetc(stdin);
printf("%d <%c>n",ch, ch);
}

对于输入"ABCD",scanf("ABC")结果为0,如预期的那样,匹配了0个输入说明符(没有要匹配的说明符,因此没有转换(,并且文件结尾和罕见的输入错误都没有发生。"ABC"被消耗掉了。收到的下一个角色是'D'.

0
68 <D>

对于输入"AB",scanf("ABC")结果 0 与 0 输入说明符匹配。"AB"被消耗掉了。收到的下一个角色是'n'.

0
13 <
>

对于输入"xyz",scanf("ABC")结果为 0,如预期的那样匹配 0 个输入说明符。什么都没有消耗。收到的下一个角色是'x'

xyz
0
120 <x>

对于输入"Ayz",scanf("ABC")结果为 0,如预期的那样,匹配 0 个输入说明符。"A"被消耗掉了。收到的下一个字符是'y'.

Ayz
0
121 <y>

输入"ABC",然后发出文件结束信号,scanf("ABC")结果为 -1(在我的机器上EOF(,如预期的那样,匹配 0 个输入说明符并检测到文件结尾。"ABC"被消耗掉了。收到的下一个角色不是角色,而是来自fgetc()EOF

ABC-1
-1 <�>

在没有 inpit 然后文件结束立即发出信号的情况下,scanf("ABC")结果为 -1(在我的机器上EOF(,正如预期的那样,匹配了 0 个输入说明符并检测到文件结束。什么都没有消耗。收到的下一个角色不是角色,而是来自fgetc()EOF

-1
-1 <�>

当我尝试运行时,它给出的输出为 -1。理想情况下,它不应该给出错误吗?

否,因为没有错误,C 通常不会发出错误消息。

根据输入,预期结果为 0 或 -1(或计算机上EOF的任何负值(。 可能存在输入匹配失败和上面看到的结果。


对于scanf("ABC"),如果输入匹配,则消耗输入,首先'A',然后'B',等等。 请注意,"A"和其余部分不是像"%d"这样的*scanf()说明符。 如果未发生文件结尾(或罕见的输入错误 - 键盘电缆损坏等(,则返回 0,否则返回EOF

如果在第一次转换(如果有(完成之前发生输入失败,fscanf函数将返回宏EOF的值。否则,该函数返回分配的输入项数,如果早期匹配失败,该数可能少于规定的输入项数,甚至为零。 C11dr §7.21.6.2 16

那么什么是输入故障呢?

如果输入项的长度为零,则指令的执行失败;此条件是匹配失败,除非文件结束、编码错误或读取错误阻止了流中的输入,在这种情况下,它是输入失败。 §7.21.6.2 9

这里

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()函数在误用、滥用或以其他方式错误使用时都不需要生成任何错误消息。

最新更新