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

C语言数组反转异常:短数组失效问题如何修复?

问题分析与修复方案

你的代码核心问题:

  • 强制读满1001个字符:循环条件用sizeof(inputString)会让程序一直等待输入,直到凑够1001个字符,完全不符合实际需求,而且输入的字符串不会自动添加\0终止符,导致后面计算长度的while循环越界读取内存里的随机值,出现你说的“卡在7、随机字符填充”的情况。
  • 长度计算逻辑失效:因为输入的数组没有正确的\0结尾,while(inputString[length] != '\0')会一直遍历到内存中碰巧出现\0的位置,得到的长度完全错误。
  • 长度输出错误:printf("%d", length+1)属于多余的加1,正确长度就是length本身。

修复步骤:

  1. 正确读取字符串:用scanf("%s", inputString)直接读取输入的字符串(自动跳过空格,末尾添加\0);如果要读取包含空格的字符串,改用fgets(inputString, sizeof(inputString), stdin),注意fgets会把换行符\n也读进去,需要手动替换成\0。
  2. 正确计算字符串长度:要么用标准库函数strlen(inputString)(记得包含头文件#include <string.h>),要么确保数组有\0结尾后再手动循环计算。
  3. 修正长度输出:直接输出length即可,不需要加1。

修复后的代码(读取不含空格的字符串):

#include <stdio.h>
#include <string.h> // 用于strlen函数

int main()
{
    char inputString[1001];

    // 读取输入的字符串,自动添加\0终止符
    scanf("%s", inputString);

    // 直接用strlen获取字符串长度,避免手动循环的错误
    int length = strlen(inputString);

    // 反转输出
    printf("字符串长度:%d\n", length);
    for(int x = length - 1; x >= 0; x--) {
        printf("%c", inputString[x]);
    }
    printf("\n"); // 换行,让输出更整洁

    return 0;
}

修复后的代码(读取包含空格的字符串):

#include <stdio.h>
#include <string.h>

int main()
{
    char inputString[1001];

    // 读取包含空格的字符串,最多读1000个字符(留位置给\0)
    fgets(inputString, sizeof(inputString), stdin);

    // 去掉fgets读取的换行符
    inputString[strcspn(inputString, "\n")] = '\0';

    int length = strlen(inputString);

    printf("字符串长度:%d\n", length);
    for(int x = length - 1; x >= 0; x--) {
        printf("%c", inputString[x]);
    }
    printf("\n");

    return 0;
}

额外注意事项:

  • 不管用哪种读取方式,都要确保输入的长度不超过数组的有效容量(1000个字符,留1个位置给\0),避免缓冲区溢出。
  • 手动计算长度时,必须保证数组最后有\0,否则会出现读取随机内存的未定义行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 16:09:26