C语言字符串字符追加异常求助:字符无法正确追加至末尾
《C程序设计语言》习题3-3 代码bug分析与修复
核心问题排查
你的代码存在三个关键bug,直接导致字符追加异常:
内部循环无限执行:
原代码内部循环的终止条件是logpre <= logpost,但logpre是固定的起始字符ASCII值(比如'a'的97),只要起始字符≤结束字符,这个条件永远为真,会无限往stringout中写入字符,这是字符追加过多的根本原因。结束字符重复写入:
遇到短横线时,外层循环的i++会让下一次循环处理stringin[i+1](即结束字符,比如'z'),但内部循环已经把结束字符写入stringout了,导致结束字符被重复追加。边界越界风险:
若短横线出现在字符串开头(i=0)或结尾(i=strlen(stringin)-1),访问stringin[i-1]或stringin[i+1]会触发数组越界,导致不可预期的错误。
修正后的代码
// 假设stringin、stringout已正确初始化,且stringout空间足够容纳展开后的内容 int i = 0, w = 0; char c, logpre, logpost; int o; int len = strlen(stringin); // 提前计算字符串长度,避免循环内重复调用strlen while (i < len) { c = stringin[i]; // 仅处理位于有效位置的短横线,且起始字符≤结束字符才展开 if (c == '-' && i > 0 && i < len - 1) { logpre = stringin[i-1]; logpost = stringin[i+1]; if (logpre <= logpost) { // 从起始字符的下一个字符开始,写到结束字符 for (o = logpre + 1; o <= logpost; w++, o++) { stringout[w] = o; } i += 2; // 跳过当前短横线和结束字符,避免重复处理 continue; } } // 非短横线或无法展开的短横线,直接写入当前字符 stringout[w] = c; w++; i++; } stringout[w] = '\0'; // 必须添加字符串结束符,避免输出乱码
修正说明
- 提前计算
len:避免循环内重复调用strlen(每次调用都会遍历字符串,降低效率)。 - 用
while循环替代for:更灵活控制i的步长,处理短横线时直接跳过后续的结束字符。 - 有效性判断:确保短横线不在边界位置,且只有起始字符≤结束字符时才展开(比如
z-a这类反向范围不会错误展开)。 - 添加结束符:
stringout作为C字符串,必须以'\0'结尾,否则会出现乱码。
测试输入a-z 0-9时,修正后的代码会输出预期的abcdefghijklmnopqrstuvwxyz 0123456789。
内容的提问来源于stack exchange,提问作者Hogan
相关产品推荐
相关产品推荐

