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

