如何在c中处理输入缓冲区

时间:2012-12-05 18:12:54

标签: c getchar input-buffer

我是c编程的新手,我正在用我的程序面对这个问题 我有一个循环,从输入缓冲区

获取一个char
while(c = getchar()){
    if(c == '\n') break;
    if(c == '1') Add();
    if(c == '2') getInput(); // this is where the headache starts
    ....
}

这是getInput()函数

void getInput()
{ 
    char ch = getchar();
    if(ch == '1') doSomething();
    ....
}

但是当从getInput()函数调用getchar()时,它只获取最后一次调用getchar()时留在输入缓冲区中的字符。而我想要它做的是获得新输入的字符。

我一直在谷歌搜索两个小时,以一个体面的方式来清除输入缓冲区,但没有任何帮助。因此,非常感谢教程或文章或其他内容的链接,如果还有其他方法可以实现,请告诉我。

2 个答案:

答案 0 :(得分:1)

这应该有效:(清除输入缓冲区的示例)

#include <stdio.h> 

int main(void)
{
  int   ch;
  char  buf[BUFSIZ];

  puts("Flushing input");

  while ((ch = getchar()) != '\n' && ch != EOF);

  printf ("Enter some text: ");

  if (fgets(buf, sizeof(buf), stdin))
  {
    printf ("You entered: %s", buf);
  }

  return 0;
}

/*
 * Program output:
 *
 Flushing input
 blah blah blah blah
 Enter some text: hello there
 You entered: hello there
 *
 */

答案 1 :(得分:1)

首先,此代码中的==条件中将存在=比较运算符而不是if赋值运算符。

while(c = getchar()){
    if(c = '\n') break;
    if(c = '1') Add();
    if(c = '2') getInput(); // this is where the headache starts
    ....
}

对于停止输入,请尝试EOF,键盘可以通过CTRL+D给出。

编辑:问题在于\n,当你按下键盘上的ENTER键时,它实际上被视为输入。所以只需改变一行代码。

if (c == \ n ) break;if (c == EOF ) break;正如我所说EOF是投入的结束。

然后你的代码就可以了。

代码流程:

step 1: suppose `2` is input 
step 2: getInput() is called
step 3: suppose `1` as input  // in getInput
step 4: doSomething() is called  // from getInput
step 5: After completion of doSomething again come back to while loop , 

but in your case you have already given `\n` character as an input 

when you pressed `1` and `ENTER`.And thus loop terminates.

但是按照我的说法更改代码后,这应该可行。

注意:为了理解代码流和出于调试目的,最佳做法是将printf()放在函数的不同位置,并查看输出哪些行正在执行,哪些不执行。