C语言字符串反转代码第三位未反转 第三四位字符赋值方法
问题描述
- 需要实现字符串指定位置赋值:将字符串第三位字符赋值给第四位字符
- 现有C语言字符串反转代码运行异常,输入
amalks时第三位字符未正确反转,输出结果为skalma,不符合预期。原代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char a[50]; int i,l,temp; setbuf(stdout,NULL); printf("enter a string"); scanf("%s",a); l=strlen(a); for(i=0;i<=l/2;i++){ temp=a[i]; a[i]=a[l-i-1]; a[l-i-1]=temp; } printf("%s",a); return EXIT_SUCCESS; }
- 实际运行输出:
enter a stringamalks skalma
问题原因
- 字符串位置赋值逻辑不清晰:C语言中字符串本质是
char类型数组,数组下标从0开始计数,日常表述的“第N位字符”对应的数组下标是N-1,直接通过下标访问即可完成赋值,不需要特殊逻辑。 - 反转循环边界错误:原代码循环条件写为
i<=l/2,会多执行一次交换。以输入amalks为例,字符串长度l=6,l/2=3,循环会执行i=0、1、2、3共4轮:- 前3轮交换完成后已经得到正确反转结果
s k l a m a - i=3时会再次交换a[3]和a[6-3-1]=a[2],把已经交换好的第3、4位字符又换回原顺序,最终得到错误结果
skalma
- 前3轮交换完成后已经得到正确反转结果
修复方法
- 指定位置字符赋值实现:
如果要把从1开始计数的第三位字符赋值给第四位,直接通过下标操作即可,代码为a[3] = a[2];,注意执行前要确认字符串长度≥4,避免数组越界。 - 修正反转循环边界:
把循环条件从i<=l/2改为i < l/2,保证只交换前半段和后半段的对应字符,不会出现重复交换的问题。另外建议把临时变量temp定义为char类型,和数组元素类型匹配更规范。
修复后的完整代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char a[50]; int i, l; char temp; setbuf(stdout,NULL); printf("enter a string"); scanf("%s",a); l = strlen(a); for(i = 0; i < l/2; i++){ temp = a[i]; a[i] = a[l-i-1]; a[l-i-1] = temp; } printf("%s",a); return EXIT_SUCCESS; }
修复后输入amalks,会正确输出反转结果sklama。
内容的提问来源于stack exchange,提问作者Amal Ks
相关产品推荐
相关产品推荐

