我是一名软件工程专业的学生,我正在休假,为了在下学期学习更好,我一直在编写各种控制台应用程序来练习。但是我遇到了一个问题,我需要从用户那里得到整数输入。我一直在使用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
我希望我说得够清楚,我感谢任何帮助。
答案 0 :(得分:6)
检查您阅读的字符串是否包含换行符。
在Unix上,这个循环是合理的:
int c;
while ((c = getchar()) != EOF && c != '\n')
;
请注意EOF测试与您引用的内容进行比较(在问题文本中;这是您在代码段中引用的内容,但它在这里分为两行,通常更易于阅读)。我会在fgets()
之后,而不是在下一个之前做“狼吞虎咽”。
在Windows上使用Microsoft编译器和库,如果您有这种想法,可以使用fflush(stdin)
。这记录了行为(请参阅MSDN网站)。在Unix上,尝试fflush(stdin)
会产生未定义的行为 - 不要这样做。