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

问题描述 投票:-3回答:3
#include <stdio.h>

int main()
{

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

}

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

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


1
投票

如果之前达到输入结束,则返回值EOF 要么是第一次成功转换,要么是匹配失败。 如果发生读取错误,也会返回EOF


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”时,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"被消耗了。收到的下一个角色不是角色,而是来自EOFfgetc()

ABC-1
-1 <�>

没有inpit,然后文件结束立即发出信号,scanf("ABC")结果-1(在我的机器上为EOF)与预期的0输入说明符相匹配,并检测到文件结束。没有消耗任何东西。收到的下一个角色不是角色,而是来自EOFfgetc()

-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

© www.soinside.com 2019 - 2024. All rights reserved.