C语言while循环异常:为何隔次跳过gets()与switch()逻辑?
为什么会出现隔次跳过迭代的情况?
嘿,这个问题我太熟了——本质上是输入缓冲区里残留的换行符在搞鬼!让我给你一步步拆解:
- 第一次迭代:当你输入选项(比如
1)后按下回车,输入缓冲区里实际存储的是"1\n"(\n就是你按下的回车)。gets()函数会读取到"1",但会把末尾的\n留在输入缓冲区里。之后switch处理完你的输入,循环进入下一轮。 - 第二次迭代:程序输出menu后调用
gets(),这时候gets()会直接读取缓冲区里剩下的\n(因为gets()遇到换行符就停止读取,并且会把这个换行符从缓冲区移除),所以input变量会被赋值为空字符串。这时候switch没有匹配的有效选项,自然就跳过处理,直接进入第三次循环。 - 第三次迭代:此时输入缓冲区已经被清空了,
gets()就会等待你输入内容,一切恢复正常。
怎么解决这个问题?
首先要提醒你:gets()是一个不安全的函数(它不检查输入长度,很容易导致缓冲区溢出,已经被C11标准废弃了),强烈建议用fgets()替代。针对这个换行符问题,你可以这样处理:
方案1:用fgets()替代并清理换行符
#include <string.h> // ... fgets(input, sizeof(input), stdin); // 去掉fgets读取到的末尾换行符 input[strcspn(input, "\n")] = '\0';
strcspn()会返回第一个\n的位置,我们把这个位置替换成字符串结束符\0,就得到了干净的输入内容。
方案2:如果非要用gets(),手动清空缓冲区
在每次调用gets()之前,先把缓冲区里残留的换行符清空:
// 清空缓冲区里的剩余字符,直到遇到换行符 while (getchar() != '\n'); gets(input);
不过要注意:如果缓冲区本来就是空的,这个while循环会等待你输入一个换行,所以最好先判断缓冲区是否有残留字符(可以用feof()或ferror()配合,但相对麻烦),所以还是方案1更稳妥。
内容的提问来源于stack exchange,提问作者user9393410
相关产品推荐
相关产品推荐

