我正在编写一些代码并使用fgets来获取用户输入。 然后我在我的代码上写了一个循环来继续询问用户输入,直到用户打印退出。 但它第二次问,它写了“请输入你的输入”2次而不是1次,并没有等到我第一次输入。 所以,我用谷歌搜索它,发现stdin缓冲区已经填满,必须清除它。 我找到了这个解决方案
void dump_line(FILE * fp) { int ch; while ((ch = fgetc(fp)) != EOF && ch != 'n') { /* null body */; } }
然后从main函数调用:
dump_line(stdin);
我很难理解它。 据我所知,它只是赋予“ch”fgetc(stdin)的值。我只是无法理解如何将fgetc(stdin)分配给“ch”清除缓冲区。 非常感谢您的帮助!
这是我用于输入用户输入的旧片段,如果我真的需要在纯C中使用它:
int get_line(char *buffer, int bsize) { int ch, len; fgets(buffer, bsize, stdin); /* remove unwanted characters from the buffer */ buffer[strcspn(buffer, "rn")] = ' '; len = strlen(buffer); /* clean input buffer if needed */ if(len == bsize - 1) while ((ch = getchar()) != 'n' && ch != EOF); return len; }
它从stdin中检索bsize
数量的字母并将它们存储到给定的缓冲区中。 stdin输入缓冲区中剩余的东西将被自动清理 。 它还从输入数据中删除换行符( r和 n)。
函数返回成功读取的字符数。
它简单地为“ch”赋予fgetc(stdin)的值
调用fgetc
会产生副作用 ,即从该文件流中读取和删除字符。
将fgetc(stdin)
分配给ch
不是清除缓冲区的原因。 这是fgetc(stdin)
的实际调用 。 每次调用(因此,循环的每次迭代)都会从stdin
一个char。
这个怎么运作:
当循环停止时,两个事情中的一个将是真的:要么你只是吃了标记当前行结束的字符(读:你现在在下一行),或者stdin
是空的,你赢了’得到更多的输入。 (后者在交互式应用程序中是不常见的,但是当人们从其他地方将内容传输到您的应用程序时很常见。为此做好准备。)
fgetc()
从缓冲区中获取一个字符。 此代码从缓冲区中读取字符,直到到达文件结尾或换行符。
这是相同的循环,但写的不同,也许这将解释它:
void dump_line(FILE * fp) { /* dump a line from fp */ int ch; /* temporary storage for character */ while (1) { ch = fgetc(fp); /* read char from fp, this removes it from the stream */ if (ch == EOF) /* break if we reached END-OF-FILE */ break; if (ch == 'n') /* break if we reached a newline, because */ break; /* we have succesfully read a line */ } }
清除缓冲区的另一个例子:
char ch[1]; while(1){ ch[0] = fgetc(stdin); if(ch[0] == 'n' || ch[0] == EOF) break; }
以上就是c/c++开发分享清除stdin缓冲区?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/562318.html