用C冲洗输入

时间:2012-12-20 23:00:08

标签: c input flush getchar

我是一名软件工程专业的学生,​​我正在休假,为了在下学期学习更好,我一直在编写各种控制台应用程序来练习。但是我遇到了一个问题,我需要从用户那里得到整数输入。我一直在使用fgetsstdin获取字符串,然后使用sscanf来获取整数(其工作正常)但是如果用户输入的字符串超过了我的缓冲区大小留在流中(包括换行符,跳过我fgets的下一次调用)。我环顾四周,发现大多数人似乎都建议while(getchar() != '\n');然而这会导致我出现问题,因为如果没有换行字符,就会进行不必要的输入扫描。

示例:

int ch;
char* buffer = (char*)malloc(BUFSIZ*sizeof(char));
while((ch = getchar()) != '\n' && ch != EOF);
fgets(buffer,BUFSIZ*sizeof(char),stdin);

如果缓冲区不是太小而且流中没有尾随字符,则会导致输入不必要的getchar()

输出:

A

A

You typed A

Intended Output:

A

You typed A

我希望我说得够清楚,我感谢任何帮助。

1 个答案:

答案 0 :(得分:6)

检查您阅读的字符串是否包含换行符。

  • 如果有换行符,则无需清除输入。
  • 如果没有新行,请在阅读之前阅读。

在Unix上,这个循环是合理的:

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

请注意EOF测试与您引用的内容进行比较(在问题文本中;这是您在代码段中引用的内容,但它在这里分为两行,通常更易于阅读)。我会在fgets()之后,而不是在下一个之前做“狼吞虎咽”。

在Windows上使用Microsoft编译器和库,如果您有这种想法,可以使用fflush(stdin)。这记录了行为(请参阅MSDN网站)。在Unix上,尝试fflush(stdin)会产生未定义的行为 - 不要这样做。