这是任务:


  编写一个将字符串s反向的函数reverse(s)。用它编写一个程序,一次将其输入反转一次。


好吧,现在,我的表演:

#include <stdio.h>

#define LIM 40

char line[LIM];
int c;
int reverse(char line[], int lim);
int len;

int main(void) {
    while ((len = reverse(line, LIM)) > 0) {
        ;
    }
    printf("\n      END OF THE PROGRAM     \n");
    return 0;
}

********** THE REVERSE FUNCTION*********
int reverse(char s[], int lim) {
    char rev[LIM];
    int i;
    for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i) {
        s[i] = c;
    }
    if (c == '\n') {
        s[i] = c;
        ++i;
    }
    s[i] = '\0';

    int r;
    for (r = 0; r < lim - 1; ++r) {
        rev[r] = s[i];
        --i;
    }
    int x;
    for (x = 0; x < lim - 1; ++x) {
        putchar(rev[x]);
    }
    printf("\n");
    return r;
}


它似乎正常工作,但是有一些与输出有关的错误。
例如:

输入:大家好输出:ydobyreve olleh

输入:abc输出:cba'

输入:ABC输出:CBA'

输入:ABC ABC输出:CBA CBA

输入:本身输出:es es'

看到?输出末尾会出现一些奇怪的“”,我无法弄清楚为什么这些“工件”会被打印出来。它对我来说是随机发生的。您能否提出任何建议,代码有什么问题?

最佳答案

您的reverse函数有问题:


您不应该将换行符存储在s数组中,因为您不希望它参与反向操作。
当您到达for中的字符串末尾时,应该停止随后的s循环,而不是一直运行到缓冲区末尾。
您应该将null终止rev数组。
您不必一次输出一个字符的rev数组,可以将它用作字符串。


这是一个经过纠正和简化的版本:

#include <stdio.h>

#define LIM 40

int reverse(char line[], int size);

int main(void) {
    char line[LIM];
    int len;

    while (reverse(line, LIM) > 0) {
        continue;
    }
    printf("\n      END OF THE PROGRAM     \n");
    return 0;
}

/* THE REVERSE FUNCTION */
int reverse(char s[], int size) {
    char rev[size];
    int i, r, c, len;
    for (i = 0; i < size - 1 && (c = getchar()) != EOF && c != '\n'; i++) {
        s[i] = c;
    }
    len = i;
    s[i] = '\0';

    for (i = 0; i < len; i++) {
        rev[len - i - 1] = s[i];
    }
    rev[i] = '\0';

    printf("%s\n", rev);
    return len;
}

09-17 20:10