簡體   English   中英

Kernighan 和 Ritchie C 練習 1-16

[英]Kernighan and Ritchie C exercise 1-16

我試圖為 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字符串,數組lineab 由於數組的最后一個元素不是\\n (因此我們正在考慮的行還沒有結束),我們保存直到現在的長度並重復循環。 然后我們將得到由cd的數組,然后是ef ,最后我們將得到只有\\n的數組。 然后, else if條件被執行,因為此數組的第一個元素是\\n ,我們打印tot從以前的加法得到的長度。 我們添加 +1 也是為了考慮新字符\\n 這也適用於奇數字符串:使用abcdefg\\n過程將繼續,直到我們到達g\\n並且求和正確完成。

在循環之外,然后我們打印文本的總量。

這是做練習的正確方法嗎?

練習說要“修改主程序”,但是您更改了MAXLINE的定義,該定義在main之外,因此這不是有效的解決方案。

此外,您的代碼沒有原始代碼的copygetline例程。 除了名稱外,您的get_line1似乎完全相同。 但是,更正解決方案將使用相同的源代碼,除了main的代碼。

此外,練習說要打印“盡可能多的文本”。 這沒有明確說明,但我希望這意味着保留MAXLINE字符的緩沖區( MAXLINE為其原始值 1000)並使用它來打印最長行的第一個MAXLINE -1 個字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM