4

我是 c 编程新手,我的程序面临这个问题
我有一个循环,从输入缓冲区获取一个字符

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() 后留在输入缓冲区中的字符。我想要它做的是获取新输入的字符。

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

4

2 回答 2

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
 *
 */
于 2012-12-05T18:17:00.090 回答
1

首先在这段代码的条件中会有==比较运算符而不是=赋值运算符。if

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

并且为了停止输入EOF,可以通过 prssing 来尝试从键盘输入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()在函数的不同位置放置并查看输出,哪些行正在执行,哪些行没有执行。

于 2012-12-05T18:20:17.060 回答