C语言字符串前出现奇怪乱码问题求助
问题:处理crontab格式字符串时出现开头乱码
场景说明
存储crontab格式字符串的数组:
#define MAX_LINES 100 #define MAX_LEN 100 char processes[MAX_LINES][MAX_LEN]; // 数组内实际存储的内容: // 0 3 * * * daily-backup // 15 4 * * sun weekly-backup // 0 10 22 7 mon deep-thought // 59 16 16 8 * submit-project // 0 2 1 * * send-monthly-newsletter
用于处理的代码:
char times[clean_line][100]; for (int z=0;z<clean_line;z++) { int x = 0; int space_counter = 0; while ( (processes[z][x] != '\0') && (space_counter < 5) ) { if (processes[z][x] == ' ') { strcat(times[z], "/"); space_counter++; x++; } else { strncat(times[z], &processes[z][x], 1); x++; } } }
执行后结果(前3行正常,后2行开头乱码):
0/3/*/*/*/ 15/4/*/*/sun/ 0/10/22/7/mon/ ����59/16/16/8/*/ K��U0/2/1/*/*/
乱码原因
C语言中,局部声明的字符数组如果未初始化,内存中会残留随机的垃圾数据。而strcat和strncat的工作逻辑是从字符串的终止符\0位置开始追加内容。
你的times数组属于局部数组,未做初始化,前几行可能刚好内存里的随机数据包含\0,所以追加正常;但后两行的初始内存没有\0,strcat/strncat会从随机的内存位置开始写入,导致开头出现乱码。
解决方法
有两种简单的修复方式:
方式1:声明时直接初始化数组
把times数组的声明改为:
char times[clean_line][100] = {0};
这样数组的每个元素都会被初始化为全0,也就是合法的空字符串(第一个字符是\0),后续的strcat/strncat就能从正确的位置开始追加。
方式2:循环内每次处理前初始化当前行
在循环的开头,先把当前行的times[z]设为空字符串:
for (int z=0;z<clean_line;z++) { times[z][0] = '\0'; // 新增:初始化当前行为空字符串 int x = 0; int space_counter = 0; // 后续原有逻辑不变 }
内容的提问来源于stack exchange,提问作者romeo_yenni
相关产品推荐
相关产品推荐

