如何修正代码实现句子单词顺序反转而非字符反转?
修正反转句子单词顺序的函数问题
你当前的revSent函数是直接反转整个字符串的所有字符,所以会把每个单词内部的字符也倒过来。要实现仅反转单词顺序、保留单词本身字符顺序的需求,得用分两步的思路:
实现步骤
- 第一步:反转整个字符串的所有字符
- 第二步:遍历字符串,把每个独立单词的字符再反转回来
原问题代码
void revSent(char str[]) { int i; int n = strlen(str); char letter; for (i = 0; i < n / 2; i++) { letter = str[i]; str[i] = str[strlen(str) - i - 1]; str[strlen(str) - i - 1]=letter ; } }
修正后的代码
// 辅助函数:反转字符串中从start到end的字符 void reverse(char str[], int start, int end) { char temp; while (start < end) { temp = str[start]; str[start] = str[end]; str[end] = temp; start++; end--; } } void revSent(char str[]) { int n = strlen(str); // 第一步:反转整个字符串,先把单词顺序倒过来 reverse(str, 0, n - 1); int start = 0; // 第二步:逐个反转每个单词,恢复单词内部的字符顺序 for (int i = 0; i <= n; i++) { // 遇到空格或字符串结尾,就反转当前区间的单词 if (str[i] == ' ' || str[i] == '\0') { reverse(str, start, i - 1); start = i + 1; } } }
代码说明
- 新增的
reverse辅助函数负责处理指定区间的字符反转,逻辑复用性更强 - 先反转整个字符串,让单词的整体顺序颠倒,但此时每个单词内部是反向的
- 再遍历字符串,遇到空格或结束符就触发当前单词的反转,把单词内部字符恢复成原顺序
- 最终就能得到「单词顺序反转、但每个单词本身字符不变」的目标效果
内容的提问来源于stack exchange,提问作者moran avtraham
相关产品推荐
相关产品推荐

