C语言逐个读取字符到数组异常:连续读取两数组时首字符异常
问题分析与解决
问题根源
输入完第一个数组内容并按下回车时,换行符\n会残留在输入缓冲区中。调用第二个receive_pool_content函数时,第一个scanf("%c")会直接读取这个换行符,而它不是空格,不会触发--i修正,直接存入pool2[0]。后续读取你输入的"q w e r t y"时,只能存入5个有效字符,最终pool2内容变成\nqwert,导致pool2[5]不是预期的y。
解决方案
方案1:手动清空输入缓冲区
在两次函数调用之间,加入代码吃掉缓冲区里的残留换行符:
int main() { char pool1[6]; char pool2[6]; receive_pool_content(pool1,6); // 清空缓冲区直到遇到换行符 while(getchar() != '\n'); receive_pool_content(pool2,6); printf("%c", pool2[5]); return 0; }
方案2:优化scanf格式(更推荐)
修改scanf的格式控制符,让它自动跳过所有空白字符(包括空格、换行、制表符):
void receive_pool_content (char pool[], int pool_size) { for (int i=0; i<pool_size; i++) { // 前面的空格会让scanf自动跳过所有空白字符 scanf(" %c", &pool[i]); } }
这种方法可以直接去掉原来的if (pool[i]==' ') --i;逻辑,因为scanf会自动跳过输入中的空格,每次循环都能读取到一个有效字符,循环pool_size次刚好填满数组,同时也避免了缓冲区残留换行符的问题。
内容的提问来源于stack exchange,提问作者Blabla
相关产品推荐
相关产品推荐

