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

时间:2018-09-05 18:24:30

标签: c

#include <stdio.h>

int main()
{

    printf("%d",scanf("ABC"));
    return 0;

}

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

3 个答案:

答案 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()函数都不需要产生任何错误消息。