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

字符数组反转函数调试求助:指针实现未正确交换字符

字符数组反转函数的问题分析与修正

你的代码核心问题在于第二个循环的终止条件错误,导致字符被重复交换,最终无法得到正确的反转结果。

问题拆解

原代码中第二个循环的条件是while(*w!='\0'),这意味着只要w指向的不是字符串结束符,就会持续交换。但实际上,当w和p两个指针相遇(指向同一个字符)或者交叉(w在p右侧)时,所有需要交换的字符已经处理完成,继续循环会把已经交换好的字符再次交换回去,抵消之前的操作。

比如处理"green"时:

  1. 初始w指向'g',p指向'n',交换后字符串变成"neegn",w右移到'r',p左移到'e'
  2. 交换'r'和'e',字符串变成"neerg",w右移到'e',p左移到'r'
  3. 此时w已经在p右侧,但*w!='\0'仍然成立,继续交换'e'和'r',字符串变回"neegn"
  4. 继续循环交换,最终回到接近原字符串的状态,导致结果错误

修正后的代码

把第二个循环的条件改为while(w < p),确保指针未交叉时才执行交换:

void mirror(char *w){
    char *p = w;
    // 移动p到字符串末尾的前一个字符(即最后一个有效字符)
    while(*p != '\0'){
        p++;
    }
    p--;
    
    // 当w在p左侧时,交换两个指针指向的字符
    while(w < p){
        char temp = *p;
        *p = *w;
        *w = temp;
        w++;
        p--;
    }
}

测试示例

调用该函数测试:

#include <stdio.h>

int main() {
    char str[] = "green";
    mirror(str);
    printf("%s\n", str); // 输出:neerg
    return 0;
}

额外说明

  • 指针w和p分别从字符串首尾向中间移动,每次交换对应位置的字符,直到指针相遇或交叉,避免重复操作
  • 注意该函数只能处理可修改的字符数组,不能直接传入字符串常量(比如mirror("green")会导致未定义行为,因为字符串常量是只读的)

内容的提问来源于stack exchange,提问作者dylangiantsfan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 14:21:09