You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 05:40:31