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

K&R C习题3-2:escape函数运行正常但源字符串首字符丢失

问题原因分析
  • 核心问题是目标数组s缓冲区溢出,触发了未定义行为:
    你定义的char s[] = ""等价于创建了长度为1的字符数组,仅能存储1个字符串结束符\0,完全没有多余空间存储转义后的长字符串。
  • C语言中局部变量通常在栈上连续分配,当前栈内存布局下,s数组的内存地址低于t数组。当你往s中写入超过其容量的内容时,溢出的数据会覆盖相邻的t数组的起始位置,直接导致t的首个字符被篡改,也就出现了首字符丢失的现象。
  • 补充隐藏问题:你的escape函数最后没有给目标数组s补字符串结束符\0,即使s空间足够,最终输出的s也可能包含乱码,你当前输出正常也属于未定义行为的巧合。
修复方案
  1. 给s数组分配足够的存储空间:最坏情况下每个原字符都需要转义为2个字符,再加上结尾的\0,因此s的长度至少是t长度的2倍加1。示例修改:
// 直接分配足够大的固定长度,或者先计算t的长度再动态申请
char s[128] = "";
  1. 在escape函数的循环结束后,补充字符串结束符:
void escape(char s[], char t[]){
    int i = 0, j = 0;
    
    while (t[i] != '\0'){
        switch (t[i]){
        case '\n':
            s[j++] = '\\';
            s[j++] = 'n';
            break;
        case '\t':
            s[j++] = '\\';
            s[j++] = 't';
            break;
        default:
            s[j++] = t[i];
            break;
        }
        i++;
    }
    s[j] = '\0'; // 新增这行补结束符
}

内容的提问来源于stack exchange,提问作者John Saylor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 05:27:03