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

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
问题原因
  1. 字符串位置赋值逻辑不清晰:C语言中字符串本质是char类型数组,数组下标从0开始计数,日常表述的“第N位字符”对应的数组下标是N-1,直接通过下标访问即可完成赋值,不需要特殊逻辑。
  2. 反转循环边界错误:原代码循环条件写为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
修复方法
  1. 指定位置字符赋值实现:
    如果要把从1开始计数的第三位字符赋值给第四位,直接通过下标操作即可,代码为a[3] = a[2];,注意执行前要确认字符串长度≥4,避免数组越界。
  2. 修正反转循环边界:
    把循环条件从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 17:25:04