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

C语言使用for循环实现字符串反转时代码运行异常,求问题原因解析

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:06:01