查看输入缓冲区,并刷新C中的额外字符

时间:2009-05-10 06:53:41

标签: c input stdin flush peek

如果我想在C中接收一个字符输入,我将如何检查是否发送了额外的字符,如果是,我该如何清除?

是否有一个像getc(stdin)一样的函数,但它不会提示用户输入一个字符,所以我可以放while(getc(stdin)!=EOF);?或者是一个查看缓冲区中下一个字符的函数,如果它没有返回NULL(或者其他任何东西),我可以调用一个(nother)函数来刷新stdin?

修改

所以现在,scanf似乎正在做这个技巧,但有没有办法让它读取整个字符串,直到新行?而不是最近的空白?我知道我可以将“%s%s%s”或其他任何内容添加到格式字符串中但是我可以处理任意数量的空格吗?

6 个答案:

答案 0 :(得分:4)

您无法刷新输入流。如果你这样做,你将调用未定义的行为。你最好的选择是:

int main() {
  int c = getchar();
  while (getchar() != EOF);
  return 0;
}

使用scanf魔法:

#include <stdio.h>
#include <stdlib.h> 

#define str(s) #s
#define xstr(s) str(s)
#define BUFSZ 256

int main() {
  char buf[ BUFSZ + 1 ];
  int rc = scanf("%" xstr(BUFSZ) "[^\n]%*[^\n]", buf);
  if (!feof(stdin)) {
    getchar();
  }
  while (rc == 1) {
    printf("Your string is: %s\n", array);
    fflush(stdout);
    rc = scanf("%" xstr(LENGTH) "[^\n]%*[^\n]", array);
    if (!feof(stdin)) {
        getchar();
    }
   }
   return 0;
}

答案 1 :(得分:1)

您可以使用getline阅读整行输入。

或者(回答您的原始问题),您可以在stdin上调用selectpoll以查看是否还有其他字符需要阅读。

答案 2 :(得分:1)

我今天遇到了类似的问题,我发现了一种似乎有用的方法。我不知道你的情况的细节,所以我不知道它是否适合你。

我正在编写一个需要从键盘获取单个字符的例程,它需要是三个特定键击之一('1','2'或'3')。如果它不是其中之一,程序需要发送和错误消息并循环回来进行另一次尝试。

问题是除了输入由getchar()返回的字符外,“Enter”键击(将键击发送到程序)保存在输入缓冲区中。然后,错误更正循环中的getchar()工具返回该(非打印)换行符,从而导致第二条错误消息(因为换行符不是'1','2' ,也不是'3'。)

问题进一步复杂化,因为我有时会超越自己,而不是输入单个字符,我将输入其中一个选项要求的文件名。然后我在缓冲区中有一整串不需要的字符,导致在屏幕上向下滚动一长串错误消息。

不酷。

但似乎已经解决了以下问题:

c = getchar();  // get first char in line
while(getchar() != '\n') ; // discard rest of buffer

第一行是实际使用我输入的字符的那一行。第二行处理输入缓冲区中剩余的任何残留物。它只是创建一个循环,从输入缓冲区一次拉一个字符。在语句循环时,没有指定要执行的操作。它只是读取一个字符,如果它不是换行符,则返回下一个字符。当它找到换行符时,循环结束并继续执行程序中的下一个业务顺序。

答案 3 :(得分:1)

我们可以创建一个清除键盘缓冲区的功能,如下所示:

#include <stdio.h>

void clear_buffer(){
   char b;
   //this loop take character by character in the keyboard buffer using 
   //getchar() function, it stop when the variable "b" was
   //enter key or EOF.
   while (((b = getchar()) != '\n') && (b != EOF));
}

int main()
{
    char input;
    //get the input. supposed to be one char!
    scanf("%c", &input); 
    //call the clearing function that clear the buffer of the keyboard 
    clear_buffer(); 
    printf("%c\n",input); //print out the first character input
    // to make sure that our function work fine, we have to get the
    // input into the "input" char variable one more time
    scanf("%c", &input); 
    clear_buffer();  
    printf("%c\n",input);
    return 0;
}

答案 4 :(得分:0)

使用会占用大量字符(大于1,可能是256)的读取,并查看实际返回的字符数。如果你得到不止一个,你知道;如果你只得到一个,那就是可用的。

你没有提到平台,这很快就变得非常棘手。例如,在Unix(Linux)上,常规机制将返回一行数据 - 可能是您追求的一个字符和换行符。或者也许你说服你的用户键入^ D(默认)来发送前面的字符。或者您可能使用控制功能将终端置于原始模式(如viemacs之类的程序)。

在Windows上,我不太确定 - 我认为有一个getch()功能可以满足您的需求。

答案 5 :(得分:0)

为什么不使用scanf而不是getc,使用scanf你可以得到整个字符串。