缓冲区中的char,防止输入整数

时间:2017-05-31 06:40:41

标签: c string input char scanf

#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'将在缓冲区中获取,并且它不会在循环的第二次迭代中请求整数输入。

2 个答案:

答案 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进行。

相关问题