很抱歉遇到这样一个平庸的问题,但是我遇到了一个看似很小的问题,但根本无法解决。对于我的任务,我必须从文件中取出一行字符串,然后将其向后放入另一个文件中,例如:
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;
}
}
我正在做的是先按字符反转每个单词,然后整行。如果有人可以帮助我找到我错过的最后一点,我将不胜感激。
答案 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;