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

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);
    }
}

代码解释

  1. 反转函数优化:去掉多余的 length 参数,直接通过指针比较完成反转,简洁高效。
  2. 单词边界识别:用 word_start 标记每个连续字母块的起始位置,遇到非字母时反转该块,确保每个独立字母序列被正确反转。
  3. 越界防护:所有遍历循环都加入 *ptr != '\0' 判断,避免指针越界访问未初始化内存。
  4. 大写转换时机:遍历每个字母时直接转为大写,符合需求。
  5. 递归替代:原递归逻辑易导致栈溢出,改为单次遍历处理整个字符串,稳定性更强。

测试你的示例输入 octopuses_have#eight(())arms@,运行后会得到预期结果 SESUPOTCO_EVAH#THGIE(())SMRA@。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 19:12:16