C语言字符串反转程序处理8字符字符串时输出异常的原因咨询
字符串反转程序的异常分析与修复
嘿,我来帮你搞定这段C语言反转代码的问题!你遇到的输入长度为8时的异常,本质上是代码里的一个指针定位错误——并不是只有长度8才会出问题,只是这个长度下,未初始化内存的随机值刚好让错误变得明显而已。
问题根源
先拆解原代码的核心逻辑:
#include <stdio.h> int main(void) { char a[100]; char x; char*i = a; printf("Enter a message:"); while ((x = getchar()) != '\n') { *i = x; i++; } while (i >= &a[0]) { printf("%c", *i--); } printf ("\n"); }
第一个while循环读取输入字符到数组a中,每读一个有效字符,指针i就向后移动一位。当遇到换行符停止循环时,i指向的是最后一个有效字符的下一个位置(比如输入8个字符,i会指向a[8],而有效字符存在a[0]到a[7])。
然后第二个while循环直接从i开始打印:
- 第一次打印的是
a[8]的值——这是数组未初始化的内存,值完全随机; - 之后才会打印
a[7]、a[6]...直到a[0]。
在你输入"what man"(8个字符)的例子中,a[8]的随机值刚好干扰了原本应该第一个输出的'n',所以出现了"am tahw"的错误输出。而输入更长字符串时,这个随机值可能是空格、空字符这类不影响视觉的内容,所以你误以为程序正常。
修复方案
只需要在进入反转打印的循环前,把指针i减1,让它指向最后一个有效字符即可:
#include <stdio.h> int main(void) { char a[100]; char x; char*i = a; printf("Enter a message:"); while ((x = getchar()) != '\n') { *i = x; i++; } // 修复:让指针指向最后一个有效字符,同时处理空输入的情况 if (i > a) { i--; } while (i >= &a[0]) { printf("%c", *i--); } printf ("\n"); }
额外优化提示
- 加入空输入判断:如果用户直接按回车,
i等于a,这时候不需要执行i--,避免指针越界; - 可以限制输入长度,防止数组溢出(比如循环条件加上
i < a + 99,避免写满100长度的数组)。
内容的提问来源于stack exchange,提问作者callmeanythingyouwant
相关产品推荐
相关产品推荐

