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

C语言实现两位数反转时输出重复内容(如5335)的问题求助

问题分析与修复

你的代码出现输出重复的问题,核心错误集中在字符串处理的基础逻辑上,具体如下:

1. 字符串数组未预留结束符空间

C语言中字符串必须以\0(空字符)作为结束标志,你定义的input[2]和output[2]仅能容纳2个字符,输入两位数后没有多余空间存储\0,会导致scanf写入越界,后续printf读取时因找不到结束符,会读取额外内存内容,引发未定义行为。

2. 错误使用sizeof获取字符串长度

sizeof(input)返回的是数组总字节数(此处为2),而非输入字符串的实际长度。且因input无\0,即使使用strlen也会得到错误结果,因此首先要修正数组大小。

3. 循环逻辑越界

初始length = sizeof(input)为2,循环条件length >=0会让循环执行3次(length从2→1→0→-1),最后一次会访问input[-1],属于数组越界操作;同时output[x]也会越界(x从0→1→2,超出output[2]的范围)。

4. 循环内过早打印输出

你在循环每一步都调用printf("%s", output),此时output既未完成反转,也无结束符,会多次输出错误内容。


修复后的代码

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

int main(void) {
    char input[3];  // 预留空间存储两位数+结束符
    char output[3];
    int length;

    printf("Enter a two-digit positive integer: ");
    scanf("%s", input);

    length = strlen(input);  // 获取输入字符串的实际长度
    int x = 0;

    // 从最后一个有效字符索引开始反转
    while (length > 0) {
        length--;
        output[x] = input[length];
        x++;
    }
    output[x] = '\0';  // 手动添加字符串结束符

    printf("The reversed number is: %s\n", output);
    return 0;
}

关键修复点说明

  • 将input和output的大小改为3,确保能容纳两位数和结束符\0。
  • 使用strlen(input)获取输入字符串的实际长度(此时input有合法结束符,结果正确)。
  • 调整循环条件为length > 0,仅遍历有效字符索引(0和1),避免越界。
  • 循环结束后手动添加output[x] = '\0',确保output是合法的C字符串。
  • 移除循环内的printf,仅在反转完成后打印最终结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 06:35:37