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