C语言指针递增失控求助:字符串单词反转与大写转换异常
问题分析与修正方案
首先,你的代码存在几个关键错误,导致指针越界和逻辑不符合需求:
核心错误点
- 字符串结束符判断错误:
*ptr != "\0"是错误的,"\0"是字符串字面量(char*类型),而*ptr是单个字符(char类型),类型不匹配,正确判断应为*ptr != '\0'(单引号包裹的字符)。 - 无效的
ptr != NULL判断:ptr是指向字符串内容的指针,只有传入NULL作为参数时它才会是NULL,遍历字符串时,你需要判断的是指针指向的内容是否为结束符'\0',而非指针本身是否为NULL。 - 单词反转逻辑错误:原代码每次遇到非字母字符时,会从字符串开头(
begin = str)反转到当前指针的前一位,这不符合“每个单词反转”的需求——你应该反转的是当前连续的字母块,而非从字符串开头到当前位置的所有内容。 - 越界的非字母跳过循环:跳过非字母字符时未判断是否到达字符串末尾,导致指针越过
'\0'访问未初始化内存。 - 函数定义不规范:
reverse函数缺少返回类型,应显式声明为void reverse(...)。
修正后的代码
#include <ctype.h> void reverse(char *ptr_start, char *ptr_end) { while (ptr_start < ptr_end) { char temp = *ptr_start; *ptr_start = *ptr_end; *ptr_end = temp; ptr_start++; ptr_end--; } } void decoding(char *str) { if (str == NULL || *str == '\0') { return; } char *ptr = str; char *word_start = NULL; while (*ptr != '\0') { // 标记单词起始位置并转大写 if (isalpha(*ptr) && word_start == NULL) { word_start = ptr; *ptr = toupper(*ptr); ptr++; } // 处理单词内的字母,转大写 else if (isalpha(*ptr) && word_start != NULL) { *ptr = toupper(*ptr); ptr++; } // 遇到非字母,反转当前单词并跳过非字母字符 else { if (word_start != NULL) { reverse(word_start, ptr - 1); word_start = NULL; } // 跳过非字母时检查是否到字符串末尾 while (*ptr != '\0' && !isalpha(*ptr)) { ptr++; } } } // 处理字符串末尾的最后一个单词 if (word_start != NULL) { reverse(word_start, ptr - 1); } }
代码解释
- 反转函数优化:去掉多余的
length参数,直接通过指针比较完成反转,简洁高效。 - 单词边界识别:用
word_start标记每个连续字母块的起始位置,遇到非字母时反转该块,确保每个独立字母序列被正确反转。 - 越界防护:所有遍历循环都加入
*ptr != '\0'判断,避免指针越界访问未初始化内存。 - 大写转换时机:遍历每个字母时直接转为大写,符合需求。
- 递归替代:原递归逻辑易导致栈溢出,改为单次遍历处理整个字符串,稳定性更强。
测试你的示例输入 octopuses_have#eight(())arms@,运行后会得到预期结果 SESUPOTCO_EVAH#THGIE(())SMRA@。
内容的提问来源于stack exchange,提问作者Derek Kwon
相关产品推荐
相关产品推荐

