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
相关产品推荐
相关产品推荐

