C语言使用for循环实现字符串反转时代码运行异常,求问题原因解析
代码问题拆解
- 头文件引用错误
你的代码包含了<stdlib.h>但没有包含字符串操作对应的头文件<string.h>,调用strlen属于隐式声明,行为未定义。 - 输入逻辑错误
你使用的scanf("%[^\n]c",&s[i]);存在两处核心问题:- 格式化符
%[^\n]本身就是匹配除换行符外所有字符的字符串规则,后面多余的c属于无效写法;同时该格式化符默认不会自动在读取完成后给字符串追加结束符\0,会导致后续strlen(s)读取长度时结果完全不符合预期。 - 你在循环中逐索引调用该scanf逻辑,实际第一次执行scanf时就会把整行输入全部写入从
s[0]开始的内存空间,完全不会按循环逐个字符读取,还存在缓冲区溢出风险。
输入逻辑可以直接简化为scanf("%49[^\n]", s);,限制最多读取49个字符,预留1位存储空间存结束符\0。
- 格式化符
- 反转逻辑错误
- 你直接在原字符串
s上从前到后覆写内容,会直接覆盖还没被读取的前半段原始字符。比如原字符串是abcd,第一次循环就把s[0]改成了d,后续要用到原始s[0]的a时已经丢失,完全得不到正确的反转结果。如果你想要原地反转(不使用额外数组),可以采用首尾交换的逻辑,遍历前半段字符和后半段对应位置互换即可,不会出现原始字符被提前覆盖的问题。 - 你定义了额外数组
a但完全没有使用,如果你不想做原地反转,完全可以把反转后的字符写入a数组,避免修改原字符串的原始数据。 - 反转完成后你没有给目标字符串追加
\0结束符,printf("%s")输出时会持续读取内存数据直到遇到随机的\0,最终输出乱码。
- 你直接在原字符串
修正后的参考代码
#include <stdio.h> #include <string.h> int main() { int i, n, c = 0; char s[50]; char a[50]; // 修正输入逻辑,限制读取长度,自动适配字符串结束符规则 scanf("%49[^\n]", s); n = strlen(s); // 反转结果写入额外数组a,不修改原字符串s for(i = n - 1; i >= 0; i--, c++) { a[c] = s[i]; } // 追加字符串结束符 a[c] = '\0'; printf("%s", a); return 0; }
内容的提问来源于stack exchange,提问作者unikatura
相关产品推荐
相关产品推荐

