C语言二维数组存储输入单词后打印出现随机字符求助
解决你的C语言数组输入乱码问题
嘿,作为刚接触C语言数组和函数的新手,遇到这种乱码问题太正常啦!我帮你分析下问题出在哪,再给你修正后的代码~
问题根源
你打印时出现随机字符,核心原因有两个:
- 字符串缺少终止符:C语言里的字符串必须以
'\0'(空字符)结尾,否则printf这类函数会一直读取内存直到碰到'\0',就会输出随机乱码。 - 循环边界和输入处理不严谨:你的循环有些小问题,可能导致数组越界或者没有正确截断输入。
具体问题拆解
- 外层循环条件错误:如果要输入
n个单词,x应该从0到n-1,而不是x <= n——后者会让你多处理一个不存在的单词(访问words[n],属于数组越界)。 - 未添加字符串终止符:当你遇到
'\n'跳出内层循环时,没有给当前的words[x]加上'\0',导致字符串不完整。 - 输入长度未限制:内层循环
y < 16,但如果用户输入16个字符,会把数组填满,没有位置放'\0',所以最多只能读15个字符。
修正后的代码
#include "mp1_lib.h" void get_words(int n, char words[][16]) { char c; // 输入n个单词,x从0到n-1 for(int x = 0; x < n; x++) { int y = 0; // 最多读15个字符,留一个位置给'\0' while(y < 15) { c = getchar(); // 遇到换行符,结束当前单词输入 if(c == '\n') { break; } words[x][y] = c; y++; } // 给当前单词加上字符串终止符,这是关键! words[x][y] = '\0'; // 处理可能的剩余输入(比如用户输入超过15个字符的情况) while((c = getchar()) != '\n' && c != EOF); } }
代码解释
- 添加
'\0'终止符:每次输入完一个单词后,手动在末尾加上'\0',确保printf能正确识别字符串结束位置。 - 调整循环边界:外层循环
x < n,保证只处理n个单词;内层循环限制最多读15个字符,避免数组溢出。 - 清理剩余输入:如果用户输入的单词长度超过15个字符,后面的字符会被丢弃,直到遇到换行符,避免影响下一个单词的输入。
这样修改后,你再打印words数组里的单词,就不会出现随机字符啦~
内容的提问来源于stack exchange,提问作者Bel
相关产品推荐
相关产品推荐

