我无法固定此功能来逐行反转文件中的单词。我不知道如何处理新行。这不是学校的任务,我只是想自己解决这个问题,而且我已经有一段时间了。我收集到单词的末尾添加了'\ 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
谢谢。
答案 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'与''结合使用,并使用||。