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

C语言控制序列转对应字符的bumpInto函数异常问题求助

问题分析与修复方案

先看你的bumpInto函数的几个核心问题:

  • 转义序列的处理逻辑混乱,用prev记录上一个字符的方式导致赋值和指针移动的顺序出错
  • 普通字符的赋值代码被注释掉了,导致大部分字符没被正确写入s
  • 没有在目标字符串末尾添加'\0'终止符,这会导致printf输出时读到内存中的垃圾数据(就是你看到的@)
  • 多余的putchar(*s)会干扰输出,因为我们的目标是填充s数组,而不是直接打印

修复后的bumpInto函数

void bumpInto(char * s, const char * t) {
    while (*t) {
        // 遇到转义符,处理后续的控制序列
        if (*t == '\\') {
            ++t; // 跳过反斜杠,看下一个字符
            switch (*t) {
                case 'n':
                    *s = '\n';
                    break;
                case 't':
                    *s = '\t';
                    break;
                // 如果遇到未知的转义序列,保留原反斜杠和后续字符
                default:
                    *s = '\\';
                    ++s;
                    *s = *t;
                    break;
            }
        } else {
            // 普通字符直接复制
            *s = *t;
        }
        ++s;
        ++t;
    }
    // 必须添加字符串终止符,否则会输出垃圾数据
    *s = '\0';
}

关键修改点说明

  • 直接检测当前字符是否为'\\',而不是依赖上一个字符的记录,逻辑更直观:遇到反斜杠就跳过它,然后根据下一个字符替换成对应的控制字符
  • 恢复了普通字符的赋值逻辑,确保所有非转义字符都能正确写入目标数组
  • 在循环结束后添加*s = '\0',保证s是一个合法的C字符串
  • 移除了多余的putchar调用,让函数专注于字符串转换的职责
  • 增加了默认分支处理未知转义序列(比如\x这类),避免程序出现意外行为

另外补充下,你的escape函数逻辑是没问题的——处理换行/制表符时,将单个字符转为两个字符的控制序列,指针移动的次数匹配字符数量,无需调整。

现在测试修复后的代码,运行结果会和预期完全一致:

Ala
ma	kota.
Ala\nma\tkota.
Ala
ma	kota.

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:50:19