【问题标题】:Kernighan and Ritchie C exercise 1-16Kernighan 和 Ritchie C 练习 1-16
【发布时间】:2021-10-13 08:58:44
【问题描述】:

我尝试为 K&R 书中的 C 语言练习实现一个解决方案。我想在这里问一下这是否可以被认为是合法的“解决方案”,只需修改main而不更改外部函数内部的内容。

修改最长行程序的主程序,使其能够 正确打印任意长输入行的长度,以及尽可能多的 尽可能的文字。

#include <stdio.h>

#define MAXLINE 2 ////

int get_line1(char s[], int lim)
{
    int c, 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';
    return i;
}

int main()
{
    int len;
    int max = MAXLINE;
    char line[MAXLINE];
    int tot = 0;
    int text_l = 0;

    while ((len = get_line1(line, max)) > 0) {
        if (line[len - 1] != '\n') {
            tot = tot + len;
        }
        if (line[1] == '\n' || line[0] == '\n') {
            printf("%d\n", tot + 1);
            text_l = text_l + (tot + 1);
            tot = 0;
        }
    }
    printf("%d\n", text_l);
}

这个想法是为数组line ad 2 设置考虑的字符串的最大长度。 对于abcdef\n 的字符串,数组line 将是ab。由于数组的最后一个元素不是\n(因此我们正在考虑的行没有结束),我们将长度保存到现在并重复循环。然后我们将获得由cd 组成的数组,然后是ef,最后我们将获得由\n 组成的数组。然后执行else if条件,因为这个数组的第一个元素是\n,我们打印前面加法得到的tot长度。我们添加 +1 是为了同时考虑新字符 \n。这也适用于奇数字符串:使用abcdefg\n,该过程将继续进行,直到我们达到g\n,并且总和正确完成。

在循环之外,我们打印文本的总量。

这是正确的练习方式吗?

【问题讨论】:

  • 满足要求的每个解决方案都同样正确。

标签: c kernighan-and-ritchie


【解决方案1】:

练习说“修改主程序”,但您更改了MAXLINE 的定义,它在main 之外,因此这不是一个有效的解决方案。

另外,您的代码没有原始的copygetline 例程。您的get_line1 似乎除了名称外相同。但是,更正解决方案将使用相同的源代码,main 中的代码除外。

此外,练习要求打印“尽可能多的文本”。这说明不清楚,但我希望这意味着保留MAXLINE 字符的缓冲区(MAXLINE 的原始值为 1000)并使用它来打印最长行的第一个 MAXLINE−1 个字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    相关资源
    最近更新 更多