You need to enable JavaScript to run this app. C语言实现大写字母前插空格时for循环死循环问题求解
优惠活动
大模型
产品
解决方案
定价
更多

C语言实现大写字母前插空格时for循环死循环问题求解

死循环问题根因

你的代码死循环的核心原因是字符串结束符\0被意外覆盖,导致外层循环永远无法检测到字符串终止条件。
C语言标准库的strlen()函数返回的是字符串不包含\0的字符个数,以你举的输入示例"AbCde"为例,它的strlen返回值为5,\0实际存储在索引为5的位置。你在右移子串时,j的初始值取的是strlen(name),执行右移操作时会把索引5位置的\0直接覆盖为原索引4的字符,且没有将\0写入新的字符串末尾,导致字符串失去结束标记,外层for循环遍历的时候永远找不到\0,就会一直运行下去。

代码修复方案

需要调整右移逻辑,将\0也同步右移,同时可以优化大写判断的可读性,修复后的代码如下:

void MultipleNames(char name[]){
    int i, j;
    // 从第2个字符开始遍历
    for(i = 1; name[i] != '\0'; i++){
        // 判断当前字符是否为大写字母,无需强制转int,可读性更好
        if(name[i] >= 'A' && name[i] <= 'Z'){
            // j的初始值改为strlen(name)+1,连'\0'一起右移
            for(j = strlen(name) + 1; j > i; j--){
                name[j] = name[j - 1];
            }
            name[i] = ' ';
            // 插入空格后跳过当前空格,避免重复判断
            i++;
        }
    }
}
额外注意事项
  • 调用函数前必须保证传入的字符数组有足够的剩余空间,至少要能容纳「原字符串长度 + 要插入的空格总数量 + 1位\0」,否则会出现缓冲区溢出问题,引发不可预期的错误。
  • 如果对性能有要求,可以提前计算字符串长度并在每次插入空格后手动更新,避免每次右移都调用strlen()遍历整个字符串计算长度。

内容的提问来源于stack exchange,提问作者Jonathan Fin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 14:15:03