2

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

有没有类似 getc(stdin) 的函数,但它不会提示用户输入字符,所以我可以输入while(getc(stdin)!=EOF);?或者一个函数来查看缓冲区中的下一个字符,如果它不返回 NULL(或任何会存在的),我可以调用一个(另一个)函数来刷新标准输入?

编辑

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

4

6 回答 6

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;
}
于 2009-05-10T07:01:30.637 回答
1

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

或者(针对您的原始问题),您可以致电selectpoll在 stdin 上查看是否还有其他字符要读取。

于 2009-05-10T08:28:44.030 回答
1

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

我正在编写一个需要从键盘获取单个字符的例程,并且它需要是三个特定击键之一(“1”、“2”或“3”)。如果不是其中之一,则程序需要发送错误消息并循环返回以再次尝试。

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

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

不酷。

但是,似乎已经解决了它的问题如下:

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

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

于 2009-05-27T03:58:27.533 回答
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;
}
于 2016-09-28T21:07:27.733 回答
0

使用需要大量字符(超过 1 个,可能是 256 个)的读取,并查看实际返回了多少个字符。如果你得到不止一个,你知道;如果你只得到一个,那就是所有可用的。

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

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

于 2009-05-10T07:00:18.470 回答
0

为什么不使用 scanf 而不是 getc,通过使用 scanf 可以获取整个字符串。

于 2009-05-10T07:09:55.093 回答