首页 > 解决方案 > 反转字符串中单词的顺序

问题描述

对于这样一个平庸的问题,我很抱歉,但我遇到了一个看似很小的问题,但根本无法克服它。对于我的任务,我必须从文件中取出一行字符串,然后将其向后放入另一个文件中,例如:

one two three
four five six

将会

three two one
six five four

我的问题是,我得到

 three two one
 si five four

所以基本上缺陷是每行开头都有一个空格字符,最后一个单词的最后一个字母总是丢失。这是我的反向功能:

void reverse(char input[], int length, char output[]) {
    char space = 32;
    input[length - 1] = space;
    int value = 0;
    int i, k = 0, j;
    for (i = 0; i <= length; i++) {
        if (input[i] == space) {
            for (j = i - 1; j >= k; j--, value++) {
                output[value] = input[j];
            }
            if (j == -1) {
                output[value] = space;
                value++;
            }
            k = i;
        }
    }

    char c = 0;
    for (int i = 0, j = length - 1; i <= j; i++, j--) {
        c = output[i];
        output[i] = output[j];
        output[j] = c;
    }
}

我正在做的是首先按字符反转每个单词,然后是整行。如果有人可以帮助我找到我错过的最后一点,我将不胜感激。

标签: c

解决方案


缺陷来自您的方法:

  • 为什么要在 offset 处强制一个空格length - 1?如果您阅读带有 的行fgets(),则该行的末尾可能有一个换行符 ( '\n'),但在输入的末尾可能缺少它,这将解释x最后一行被覆盖的原因。
  • 您不应该修改输入缓冲区。

这是一个简化版本,以及一个简单的main功能:

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

void reverse(const char *input, int length, char *output) {
    int i, j, k, v;
    for (i = k = v = 0;; i++) {
        if (i == length || input[i] == ' ') {
            for (j = i; j-- > k; v++) {
                output[v] = input[j];
            }
            for (; i < length && input[i] == ' '; i++) {
                output[v++] = ' ';
            }
            if (i == length) {
                output[v] = '\0';
                break;
            }
            k = i;
        }
    }
    for (i = 0, j = length - 1; i < j; i++, j--) {
        char c = output[i];
        output[i] = output[j];
        output[j] = c;
    }
}

int main() {
    char input[256];
    char output[256];

    while (fgets(input, sizeof input, stdin)) {
        reverse(input, strcspn(input, "\n"), output);
        puts(output);
    }
    return 0;
}

输出:

three two one
six five four

这是一个更简单的反向函数,一次运行:

#include <string.h>

void reverse(const char *input, int length, char *output) {
    int i, j, k, v;
    for (i = k = 0, v = length;; i++) {
        if (i == length || input[i] == ' ') {
            for (j = i; j-- > k;) {
                output[--v] = input[j];
            for (; i < length && input[i] == ' '; i++) {
                output[--v] = ' ';
            }
            if (v == 0) {
                output[length] = '\0';
                break;
            }
            k = i;
        }
    }
}

推荐阅读