C语言数组反转异常:短数组失效问题如何修复?
问题分析与修复方案
你的代码核心问题:
- 强制读满1001个字符:循环条件用
sizeof(inputString)会让程序一直等待输入,直到凑够1001个字符,完全不符合实际需求,而且输入的字符串不会自动添加\0终止符,导致后面计算长度的while循环越界读取内存里的随机值,出现你说的“卡在7、随机字符填充”的情况。 - 长度计算逻辑失效:因为输入的数组没有正确的
\0结尾,while(inputString[length] != '\0')会一直遍历到内存中碰巧出现\0的位置,得到的长度完全错误。 - 长度输出错误:
printf("%d", length+1)属于多余的加1,正确长度就是length本身。
修复步骤:
- 正确读取字符串:用
scanf("%s", inputString)直接读取输入的字符串(自动跳过空格,末尾添加\0);如果要读取包含空格的字符串,改用fgets(inputString, sizeof(inputString), stdin),注意fgets会把换行符\n也读进去,需要手动替换成\0。 - 正确计算字符串长度:要么用标准库函数
strlen(inputString)(记得包含头文件#include <string.h>),要么确保数组有\0结尾后再手动循环计算。 - 修正长度输出:直接输出
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
相关产品推荐
相关产品推荐

