C语言实现字符串按单词反转 代码仅返回首个反转词且报错
问题分析
你遇到的报错和功能异常由以下几个问题共同导致:
- 空指针访问:你调用
piece = strtok(NULL, " ")获取下一个单词后,没有判断piece是否为NULL就直接执行strcpy(beg, piece)。strtok遍历完所有单词后会返回NULL,strcpy接收NULL作为源地址时会尝试读取0地址内存,直接触发你遇到的访问违规错误。 - 变量逻辑错误:
- 变量重复定义:你先定义了
int n = strlen(piece)-1存储第一个单词的长度,后续又重复定义int n = 0,直接覆盖了之前的有效值。 - 循环变量未重置:遍历字符的变量
i只在进入循环前赋值为0,处理完第一个单词后i已经等于第一个单词的长度,处理后续单词时不会从头开始遍历,反转逻辑完全失效。 - 新单词参数未更新:每次获取到新的单词片段
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
相关产品推荐
相关产品推荐

