2

我是一名软件工程专业的学生,​​我正在圣诞节放假,以便在下学期变得更好,我一直在编写各种控制台应用程序来练习。但是我遇到了一个问题,我需要从用户那里获取整数输入。我一直在使用fgets从中获取字符串stdin,然后使用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

我希望我说得足够清楚,我很感激任何帮助。

4

1 回答 1

6

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

  • 如果有换行符,则不需要清除输入。
  • 如果没有换行符,请阅读直到遇到一个。

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

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

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

在带有 Microsoft 编译器和库的 Windows 上,如果你有心,你可以玩fflush(stdin)。这已经记录了行为(请参阅 MSDN 网站)。在 Unix 上,尝试fflush(stdin)会产生未定义的行为——不要这样做。

于 2012-12-20T23:06:22.247 回答