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
相关产品推荐
相关产品推荐

