C程序用新行反转字符串

时间:2019-08-06 05:17:48

标签: c function reverse

我无法固定此功能来逐行反转文件中的单词。我不知道如何处理新行。这不是学校的任务,我只是想自己解决这个问题,而且我已经有一段时间了。我收集到单词的末尾添加了'\ n'字符,并且算法无法解决这个问题,我也不知道该怎么做。您能告诉我如何正确实施吗?

void reverseWord (char* buffer, int size) 
{ 
    char* start = buffer; 

    // bounds 
    char* temp = buffer; 

    // Reversing the words
    while (*temp) { 
        temp++; 
        if(*temp == '\n'){
            temp++;
        }
        if (*temp == '\0') { 
            reverse(start, temp - 1); 
        } 
        else if (*temp == ' ') { 
            reverse(start, temp - 1); 
            start = temp + 1; 
        } 
    } 

    // Reverse the entire string 
    reverse(buffer, temp - 1); 
} 




void reverse(char* begin, char* end) 
{ 
    char temp; 
    while (begin < end) { 
    temp = *begin; 
    *begin++ = *end; 
    *end-- = temp; 
    } 
}

我的输入文件是:

    this is line 1
    this is line 2
    this is line 3
    this is line 4
    this is line 5

我想要的输出是:

    5 line is this
    4 line is this
    3 line is this
    2 line is this
    1 line is this

我的实际输出是这样

    5
     line is this4
     line is this3
     line is this2
     line is this1

谢谢。

2 个答案:

答案 0 :(得分:0)

首先:如果您以“简单”语言(如C)在此处发布问题,请提供minimal reproducible example,如@Yunnosch所说。它将使您有更多的人尝试您的代码。

如果它像原始的那样就足够了

int main() {
  char buffer[] =
    "this is line 1\n"
    "this is line 2\n"
    "this is line 3\n"
    "this is line 4\n"
    "this is line 5\n";
  printf("%s", buffer);
  reverseWord(buffer, strlen(buffer));
  printf("%s", buffer);
}

顺便说一句,我从未经修改的代码中得到的输出与您发布的内容有些不同:

5
 line is 4
this line is 3
this line is 2
this line is 1
this line is this

好,现在输入您的代码。

您的while循环将永远不会将if (*temp == '\0')评估为true,因为其条件将事先中断循环。但这不是原因。

您可以像其他任何空白字符一样查看换行符。所以我成功地尝试了这一点:

while (*temp) {
    temp++;
    if (isspace(*temp)) {
        reverse(start, temp - 1);
        start = temp + 1;
    }
}

您需要为#include <ctype.h> isspace()

即使对于\r\n之类的Windows风格的换行符,它似乎也适用。但是您应该仔细检查换行符是否正确。您可能想学习为此使用调试器。

答案 1 :(得分:0)

我已经运行了您的代码,并且找到了一些适合您的答案:

1)如果reverseWord(..)的输入是单行,例如“ this is line 1”,则输出将是“ 1 line is this”,这是完美的。现在,您只需为文件中的每一行调用该函数即可。

2)如果您为reverseWord(..)输入的是文件中的整个文本,请在reverseWord(..)中输入if(*temp =='\n')... 只需输入与为“”相同的内容即可。 这个:

If (*temp == '\n') {
    reverse(start, temp-1);
    start = temp + 1;
}

还!确保正确获取尺寸。在您的情况下,每行为15个字符。 (包括'\n''\0'

顺便说一句,请考虑将'\ n'与''结合使用,并使用||。