C语言字符串处理触发Segmentation fault (core dumped)错误求助
问题分析与解决
需求为在字符串的每个大写字母前添加空格(示例:AaaBbbCcC → Aaa Bbb Cc C),现有代码触发Segmentation fault (core dumped)错误,以下是具体分析与修正方案:
错误原因分析
- 数组越界访问:数组
s的大小为500,但每次插入空格时都会让stringsize自增,未检查剩余空间。当插入空格过多时,字符串总长度超过数组容量,访问到数组外的内存,触发段错误。 - 循环逻辑缺陷:
for循环以s[i] != '\0'为条件,插入空格后原大写字母会被移到i+1的位置,下一次循环i++会重复处理该字符,最终因无限循环+数组越界触发错误;同时插入空格后直接重置a的值,导致后续字符移动范围逻辑错误。 - scanf格式符错误:代码中
scanf("%199[^\n]s", s);多了一个s,正确格式应为%199[^\n],多余的s会导致输入处理异常。
修正后的代码
#include <stdio.h> #include <ctype.h> #define TAM 500 void function(char s[]) { // 统计原字符串长度与需要插入的空格数 int original_len = 0; int space_count = 0; while (s[original_len] != '\0') { if (isupper((unsigned char)s[original_len])) { space_count++; } original_len++; } // 检查插入空格后的总长度是否超出数组容量(预留'\0'位置) if (original_len + space_count >= TAM) { printf("Error: 字符串过长,无法插入足够空格\n"); return; } // 从后往前移动字符并插入空格 int target_idx = original_len + space_count; s[target_idx] = '\0'; // 设置新的字符串结束符 for (int i = original_len - 1; i >= 0; i--) { if (isupper((unsigned char)s[i])) { s[--target_idx] = s[i]; s[--target_idx] = ' '; } else { s[--target_idx] = s[i]; } } } int main() { char s[TAM]; // 限制输入长度为TAM-1,避免数组越界 scanf("%499[^\n]", s); function(s); printf("%s\n", s); return 0; }
代码说明
- 提前统计空格数:先计算需要插入的空格总数,确认总长度不会超过数组容量,从根源避免越界。
- 从后往前处理:无需反复移动前面的字符,效率更高,同时避免重复处理同一大写字母的问题。
- 使用
isupper函数:比直接判断字符范围更可靠,适配不同字符编码场景。 - 修正输入逻辑:限制输入长度为数组容量减1,确保输入字符串不会超出数组范围。
内容的提问来源于stack exchange,提问作者clebinho
相关产品推荐
相关产品推荐

