c - K&R 1.19 练习 ("reverse"函数)

标签 c arrays string function kernighan-and-ritchie

这是任务:

Write a function reverse(s) that reverses the character string s . Use it to write a program that reverses its input a line at a time.

好的,现在,我的表演:

#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

输入:se se 输出:es es'

看到了吗?输出末尾出现一些奇怪的“'”,我无法找出打印这些“工件”的任何模式。它是随机发生的(对我来说)。您能提出什么建议吗?代码有什么问题吗?

最佳答案

您的reverse函数有问题:

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

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

  • 您应该以 null 终止 rev 数组。

  • 您不需要每次输出一个字符的 rev 数组,而是将 is 作为字符串使用。

这是一个更正和简化的版本:

#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;
}

关于c - K&R 1.19 练习 ("reverse"函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40834494/

相关文章:

php - 使用 PDO fetch 获取数组并使用 if 语句

java - 无法使用另一个类正确访问数组

javascript - 在我的阵列上使用 axios 发送数据的问题

java - 字符串替换android?

c - 文本文件无法在 C 中打开

c - 如果所有位都为 0,那么 IEEE float 的值是多少?

c - 使用 xcode 学习 C(通过 K&R)

c - GetPixel优化winapi

c - 如何使用 : "\\" or "\"? 分割字符串

Java字符串分割错误