#include <stdio.h>
int main(void) {
int n,m=5;
char c;
while(m>0)
{
m--;
scanf("%d",&n);
if(n==42)
break;
printf("%d",n);
fflush(stdin);
scanf("%c",&c);
puts(&c);
}
return 0;
}
虽然我知道在第一个scanf
输入一个数字后按下一个输入时,它(输入)被第二个scanf
作为输入,但我怀疑的是,当我给出5ttttt
作为输入,输出为
5t
5t
5t
5t
5t
因为输入缓冲区中没有整数,为什么不要求输入整数|
第二个问题是,即使我们遵循上述行为,然后输入5t
然后按Enter键应该使用两个字符作为缓冲区('t'和'enter')但只有t在缓冲区和输出
5t
但我期望输出
5t
5
因为'enter'将在缓冲区中获取,并且它不会在循环的第二次迭代中请求整数输入。
答案 0 :(得分:2)
首先,请看这个关于fflush(stdin);
being undefined behaviour的帖子,根本不做。
你可以滚动你自己的功能去完成这件事。
的一些方面 while ((c = getchar()) != '\n' && c != EOF) { }
应该很好地完成这项工作。
那就是说,
puts(&c);
也会导致undefined behavior,因为&c
未指向字符串。变量c
的类型为char
,它不是char
数组,必须将强制空终止视为 string 。因此,由于内存溢出,您实际上是访问导致UB的绑定内存。
您可能希望改用putchar()
。
答案 1 :(得分:-1)
避免使用fflush(stdin)
。您可以使用fflush(stdin)
代替getchar()
。
在按scanf("%d", &n)
给出整数输入后,您按Enter键,对吗? \n
getchar()
(新行字符)将由scanf("%c", &c)
执行,您可以安全地通过\n
输入字符。否则,c
将由hasMany
进行。