字符数组反转函数调试求助:指针实现未正确交换字符
字符数组反转函数的问题分析与修正
你的代码核心问题在于第二个循环的终止条件错误,导致字符被重复交换,最终无法得到正确的反转结果。
问题拆解
原代码中第二个循环的条件是while(*w!='\0'),这意味着只要w指向的不是字符串结束符,就会持续交换。但实际上,当w和p两个指针相遇(指向同一个字符)或者交叉(w在p右侧)时,所有需要交换的字符已经处理完成,继续循环会把已经交换好的字符再次交换回去,抵消之前的操作。
比如处理"green"时:
- 初始
w指向'g',p指向'n',交换后字符串变成"neegn",w右移到'r',p左移到'e' - 交换'r'和'e',字符串变成"neerg",
w右移到'e',p左移到'r' - 此时
w已经在p右侧,但*w!='\0'仍然成立,继续交换'e'和'r',字符串变回"neegn" - 继续循环交换,最终回到接近原字符串的状态,导致结果错误
修正后的代码
把第二个循环的条件改为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
相关产品推荐
相关产品推荐

