偷看输入缓冲器,并冲洗用C额外的字符(peek at input buffer, and flush

2019-09-28 01:47发布

如果我想获得在C一个字符输入,我怎么会检查,看看是否额外的字符被送到,如果是的话,我会如何清除?

有没有这就像GETC(标准输入)的功能,但不提示用户输入一个字符,这样我就可以把while(getc(stdin)!=EOF); ? 或功能偷看在缓冲区中的下一个字符,如果它不返回NULL(或任何会在那里),我可以打电话(另)一个函数,它刷新标准输入?

编辑

所以,现在,scanf函数似乎做的伎俩,但有没有办法得到它读取字符串,直到换行? 而不是最近的空白? 我知道我可以只是把“%s%s%S”或任何为格式字符串,但我可以处理任意的空间是多少?

Answer 1:

你可以不刷新输入流。 如果你这样做你会被调用未定义的行为。 最好的办法是做:

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;
}


Answer 2:

您可以使用getline读取输入的一整行。

或者(响应你原来的问题),你可以调用selectpoll标准输入,看是否有要读取其他字符。



Answer 3:

我今天也有类似的问题,我发现,似乎工作的方式。 我不知道你的情况的细节,所以我不知道它是否会为你工作或没有。

我正在写需要得到从键盘单个字符例行公事,它需要三个特定按键一(“1”,“2”或“3”)。 如果不是其中的一个,该程序需要发送和错误信息,并回送闯闯。

的问题是,除了字符i输入被的getchar()返回时,“Enter”键的键击(它发送键击到程序)被保存在输入缓冲器中。 该(非印刷​​)新行字符,然后通过在误差校正回路的的getchar()设施返回,在第二错误消息进一步所得的(因为新行字符不是任一“1”,A“2” ,也不是 '3'。)

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

不冷静。

什么似乎已经解决了它,虽然,如下:

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

第一行是实际使用我进入角色之一。 第二行处置的任何残余物保留在输入缓冲器中。 它只是简单地创建一个循环,在从输入缓冲器中的时间拉动一个字符。 有没有规定,而语句循环发生作用。 它只是简单地读入一个字符,如果它不是一个新行,可以追溯到下一个。 当它发现一个换行符,循环结束,并继续对业务的程序中的下一个订单。



Answer 4:

我们可以做一个函数来清除键盘缓冲区,如下所示:

#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;
}


Answer 5:

使用读这会占用大量的字符(大于1,也许256)的,看看有多少真正返回。 如果你不止一个,你知道; 如果你只有一个,那就是所有可用。

你不提平台,这得到相当棘手相当迅速。 例如,在Unix(Linux)的,正常的机制将返回数据线 - 也许你是后一个字符和一个换行符。 或者,也许你说服你的用户键入^ d(默认)发送前面的字符。 或者,也许你使用控制功能付诸原始模式(如如程序的终端viemacs一样)。

在Windows上,我不敢肯定-我认为这是一个getch()函数,它把你所需要的。



Answer 6:

你为什么不使用scanf函数,而不是GETC,利用scanf函数u能得到整个字符串。



文章来源: peek at input buffer, and flush extra characters in C