c - getchar 的意外行为

标签 c do-while getchar

刚刚学习 C 编程,并坚持我确定的关于 Do/While 循环的一些微不足道的事情。我有一段代码要求用户按“E”退出程序:

char exitletter;

do {
printf ("Please hit E to exit the Program\n");
exitletter = getchar();
} while (exitletter !='E');

但是,如果用户输入的字符不正确,它会打印两次“请按 E 退出程序”。如果用户输入 abcd,它会打印五次消息。

有人可以解释一下这里发生了什么吗?

最佳答案

那是因为在第一次 getchar

时输入的换行符

考虑一下,如果您按 N 然后按 enter 键来提供输入方式。实际上,您输入了两个字符,一个是 N,另一个是换行符 (\n)。首先 getchar 将从 stdin 中读取 N 并且换行符保留在 stdin 缓冲区本身中。现在它会打印语句然后它会尝试去第二次 getchar 那个时候它不会等待你输入因为一个字符已经在 stdin 缓冲区中可用,所以它会读取换行符,然后用 E 检查,这次循环也不会中断,它会打印 statemnt,它会在第三个 getchar 等待用户输入。

如果向 getchar 提供输入的方式类似于键入该字符并按回车键意味着,请使用以下逻辑来帮助您摆脱此问题。

do {
    printf ("Please hit E to exit the Program\n");
    exitletter = getchar();
    while(exitletter == '\n')exitletter = getchar();
} while (exitletter !='E');

关于c - getchar 的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14665166/

相关文章:

c - C 中的刷新输入

c - while 循环中的 getchar() 问题

C 字符串比较失败?

c - 就地与分配 API

c - 如何将十进制数转换为十六进制数,然后将相应的结果作为十进制值存储在整数中

c# - 不能声明局部变量名称 'choice',因为它会给 'choice' 不同的含义

c++ - 为什么 { } while(condition);末尾需要分号但 while(condition) {} 不需要?

c - getchar() 和 putchar()

尝试编译 HPCC 基准测试时无法链接到 BLAS/ATLAS

c++ - 为什么switch不会在条件下执行