gpt4 book ai didi

c - 使用 scanf 和模拟 EOF 时控制台应用程序的未定义行为

转载 作者:太空宇宙 更新时间:2023-11-04 00:01:58 25 4
gpt4 key购买 nike

这类问题可能看起来像是那些令人讨厌的考虑因素之一,但我宁愿请您彻底解释正在发生的事情以满足我的好奇心。

假设我们有以下代码块:

#include <stdio.h>

int main(void)
{
char ch;

scanf("%c", &ch);
printf("%d\n", ch);

return 0;
}

编译后,可以在行首使用 CTRL+Z 快捷键键入模拟的 EOF,然后按 ENTER 键 - 这会完成两次。

输出看起来像这样:
^Z
^Z
-52
按任意键继续 。 . .

1) 现在发生了什么?

我对这样的循环还有一个疑问:

while (scanf("%c", &ch) != EOF)
printf("%c\n", ch);

printf("BYE!\n");

输出将是:
^Z
^Z
再见!
按任意键继续 。 . .

2) 为什么它在第一次 EOF 模拟后没有终止?

编辑:我在 SO 上搜索了与我的疑问相关的另一个答案,我认为很难使用 scanf(),因为它有更好的替代品,例如 fgets()fread()。请看下面的另一个例子:

int input;
char ch;

while (scanf("%d", &input) != 1) //checking for bad input
while ((ch = getchar()) != '\n') //disposing of bad input
putchar(ch);

printf("BYE!\n");

我在行首输入五次 CTRL+Z ,输出将变为:
^Z
^Z
^Z
^Z
^Z
^Z
^Z
^Z
^Z
^Z
^C按任意键继续。 . .
我又添加了五个 EOF,并且不得不在最后一行使用 CTRL+C 终止程序。

3) 为什么空格出现在第 5 行并且一直可见到末尾(有时两个空格在'^CPress any key to continue . . .'之前)?

最后一个例子是上面循环的修改(代码中没有意义):

while (scanf("%d", &input) != EOF);  

printf("BYE!\n");

输出是:
^Z
^Z
^Z
再见!
按任意键继续 。 . .

4) 为什么我们使用三次 CTRL+Z 而不是上面评论中写的两次?

最佳答案

您的代码调用了未定义的行为。如果 scanf() 无法读取格式字符串 "%c" 的字节,它返回 EOF 并离开 ch未初始化。

最好这样写代码:

while (scanf("%c", &ch) == 1)
printf("%c\n", ch);

printf("BYE!\n");

关于c - 使用 scanf 和模拟 EOF 时控制台应用程序的未定义行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39711028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com