K& R 1.19运动(“反向”功能)

时间:2016-11-27 22:08:39

标签: c arrays string function kernighan-and-ritchie

这是任务:

  

写一个反转字符串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;
}

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

INPUT:大家好输出: ydobyreve olleh

INPUT :abc 输出:cba'

INPUT :ABC 输出:CBA'

INPUT :ABC ABC 输出:CBA CBA

INPUT :选择输出:es es'

请参阅?一些奇怪的“'”出现在输出的末尾,我无法弄清楚为什么这些“工件”被打印出来的任何模式。它随机发生(对我来说)。你能否提出一些建议,代码中有什么问题?

2 个答案:

答案 0 :(得分:1)

您的reverse功能有问题:

  • 您不应将换行符存储到s数组中,因为您不希望它参与相反的操作。

  • 当你到达for中字符串的末尾时,你应该停止后续的s循环,而不是一直运行到缓冲区的末尾。

  • 您应该终止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;
}

答案 1 :(得分:0)

更多模块化的解决方案。我不确定K&R“一次一行”是什么意思。但这将反转字符串,直到找到换行符为止。然后等待用户重复。

#include <stdio.h>

#define MAXLINE 1000

int get_line(char s[], int limit);
int reverse(char to[], char from[], int l);

int main() {
    int size;
    char line[MAXLINE];
    while ((size = get_line(line, MAXLINE)) > 0) {
        char revline[size];
        int len = reverse(revline, line, size);
        printf("%s\n", revline);
    }

    return 0;
}

int reverse(char to[], char from[], int l) {
    int i;
    int j = l - 2;
    for (i = 0; i < l; i++, j--) {
        to[i] = from[j];
    }
    to[i] = '\0';
    return i;
}

// read a line into s until limit
// return length of line
int get_line(char s[], int limit) {
    int c = 0;
    int i = 0;

    for (i = 0; i < limit-1 && (c = getchar()) != '\n'; ++i) {
        s[i] = c;
    }
    if (c == '\n') {
        s[i] = c;
        ++i;
    }
    s[i] = '\0';
    return i;
}

输出:

testing one two
owt eno gnitset
three four
ruof eerht
five six
xis evif