fgetc调用后fgets仅读取' ',程序输入异常求排查
问题分析:fgets被跳过的原因及解决办法
这个问题本质是输入缓冲区的残留字符在搞鬼,咱们一步步拆解:
输入行为的细节
当你输入2然后按下回车时,实际输入到标准输入缓冲区里的是两个字符:'2'+'\n'(回车对应的换行符)。fgetc的读取行为
第8行的c = fgetc(stdin);只会从缓冲区里读取第一个字符'2',但换行符'\n'会被留在缓冲区里,没有被处理。fgets的“坑点”
fgets的工作逻辑是:从输入流读取字符,直到遇到换行符或者达到指定长度上限,并且会把换行符也读入目标数组,再自动加上字符串终止符'\0'。
这时候调用fgets(n, 30, stdin);时,缓冲区里第一个字符就是残留的'\n',所以fgets直接把这个换行符读进了n数组,看起来就像被“跳过”了——用户根本没机会输入新内容,n里就只有一个换行符。删除第8行后问题消失的原因
删掉c = fgetc(stdin);后,输入缓冲区一开始是空的,fgets会主动等待用户输入,直到用户按下回车,这时候它会正常读取用户输入的内容(包括最后按下的换行符),不会出现被跳过的情况。
额外解决办法(如果需要保留fgetc的话)
如果你的代码逻辑必须保留fgetc的读取操作,可以在读取完'2'后,手动清理缓冲区里的残留换行符:
c = fgetc(stdin); // 循环读取缓冲区剩余字符,直到遇到换行符为止 while ((getchar()) != '\n');
这样后续的fgets就能正常等待用户输入,不会被残留的换行符干扰了。
内容的提问来源于stack exchange,提问作者Nownuri
相关产品推荐
相关产品推荐

