将字串中的字词顺序倒转

时间:2018-11-13 20:43:05

标签: c

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

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

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

2 个答案:

答案 0 :(得分:4)

缺陷来自您的方法:

  • 您为什么要在偏移量length - 1处插入空格?如果您用fgets()读取该行,则该行的末尾可能会有一个换行符('\n'),但是在输入的末尾可能会丢失它,这将解释{{1 }}在最后一行被覆盖。
  • 您不应修改输入缓冲区。

以下是简化版本,以及简单的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

答案 1 :(得分:0)

input[length - 1] = space;替换为input[length] = space;