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

C语言实现字符串按单词反转 代码仅返回首个反转词且报错

问题分析

你遇到的报错和功能异常由以下几个问题共同导致:

  • 空指针访问:你调用piece = strtok(NULL, " ")获取下一个单词后,没有判断piece是否为NULL就直接执行strcpy(beg, piece)。strtok遍历完所有单词后会返回NULL,strcpy接收NULL作为源地址时会尝试读取0地址内存,直接触发你遇到的访问违规错误。
  • 变量逻辑错误:
    1. 变量重复定义:你先定义了int n = strlen(piece)-1存储第一个单词的长度,后续又重复定义int n = 0,直接覆盖了之前的有效值。
    2. 循环变量未重置:遍历字符的变量i只在进入循环前赋值为0,处理完第一个单词后i已经等于第一个单词的长度,处理后续单词时不会从头开始遍历,反转逻辑完全失效。
    3. 新单词参数未更新:每次获取到新的单词片段piece后,你没有同步更新prev、pbeg以及单词长度n的取值,所有逻辑都基于第一个单词的参数运行,自然只能输出第一个反转后的单词。
  • 潜在非法写入风险:strtok返回的指针指向原输入字符串的地址,如果你的输入字符串是只读的字符串字面值,直接通过prev指针修改原字符串内容也会触发访问异常。
参考实现

你可以参考如下更简洁的实现思路:

#include <stdio.h>
#include <string.h>

#define MAX_LEN 1024

// 反转单个单词,入参为单词的首尾地址
void reverse_word(char* start, char* end) {
    char tmp;
    while (start < end) {
        tmp = *start;
        *start = *end;
        *end = tmp;
        start++;
        end--;
    }
}

int main() {
    char str[MAX_LEN] = "I like dogs";
    char *cur = str, *word_start = str;
    
    // 遍历整个字符串,遇到空格就反转前面的单词
    while(*cur != '\0') {
        if (*cur == ' ') {
            reverse_word(word_start, cur - 1);
            word_start = cur + 1;
        }
        cur++;
    }
    // 反转最后一个单词
    reverse_word(word_start, cur - 1);
    
    printf("%s\n", str); // 输出 I ekil sgod
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:24:05