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

C语言字符串字符追加异常求助:字符无法正确追加至末尾

《C程序设计语言》习题3-3 代码bug分析与修复

核心问题排查

你的代码存在三个关键bug,直接导致字符追加异常:

  1. 内部循环无限执行:
    原代码内部循环的终止条件是logpre <= logpost,但logpre是固定的起始字符ASCII值(比如'a'的97),只要起始字符≤结束字符,这个条件永远为真,会无限往stringout中写入字符,这是字符追加过多的根本原因。

  2. 结束字符重复写入:
    遇到短横线时,外层循环的i++会让下一次循环处理stringin[i+1](即结束字符,比如'z'),但内部循环已经把结束字符写入stringout了,导致结束字符被重复追加。

  3. 边界越界风险:
    若短横线出现在字符串开头(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 04:06:27