簡體   English   中英

這些最后一行代碼在K&R的C編程語言的練習1-13中做了什么?

[英]What are these last lines of code doing in Exercise 1-13 of K & R's The C Programming Language?

我對編程一般都很陌生,所以請忍受我缺乏的知識。

我現在花了幾個小時進行練習1-13。 我終於決定查找答案,我在這個鏈接上找到了這個鏈接https://github.com/ccpalettes/the-c-programming-language-second-edition-solutions/blob/master/Chapter1/Exercise%201-13 /word_length.c

因為我不想為了學習而完全復制它,所以我試着理解代碼然后重新制作它。 (這導致了幾乎完整的副本,但我理解它比其他方式更好。)

這是我到目前為止:

#include <stdio.h>

#define IN 1
#define OUT 0
#define LARGEST 10

main() 
{
    int c, state, l, i, j;
    int length[LARGEST + 1];

    for (i = 0; i <= LARGEST; ++i)
    length[i] = 0;

    state = OUT;

    while ((c = getchar()) != EOF) {
        if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
            if (state == OUT) {
                l = 0;
                state = IN;
            }
        ++l;
        }
        else 
            if (state == IN) {
                if (l <= LARGEST)
                    ++length[l - 1]; 
                    //minus 1 because the nth term of an array is actually array[n-1]
                else //if (l > LARGEST)
                    ++length[LARGEST];
                state = OUT;
            }
            if (c == EOF)
                break;
    }

    for (i = 0; i <= LARGEST; ++i) {
        if (i != LARGEST) //because array[10] refers to the 11th spot
            printf("\t %2d |", i + 1); //plus one because 1st is array [0] 
            //this actually results in 1-10 because the 0-9 plus one makes the highest 10
        else
            printf("\t>%2d |", LARGEST);
        for (j = 0; j < length[i]; ++j)
            putchar('x');
        putchar('\n');
    }


    return 0;
}

請忽略我的評論。 它們是給我的,所以我可以自己解釋這個程序。

我有兩個問題,我無法弄清楚,他們讓我發瘋:

  1. 輸出總是比輸入中的一個字少,這意味着“我的名字不是bob”導致:

     ... 2 |xx 3 |x 4 |x ... 
  2. 另外,我不明白程序結束時發生了什么。 具體來說,我不明白為什么使用變量j

      for (j = 0; j < length[i]; ++j) putchar('x'); 

非常感謝您的幫助,如果這對社區來說太初學,我很抱歉。

好吧,試圖總結所有答案,因為問題沒有結束。 首先,我們需要更正main()行:

    int main(void) {
    ...
    return 0;
    }

int是必需的,因為你在函數的末尾返回一個值,而void意味着函數沒有接收到任何參數。

  1. 我復制了你的代碼並在我的機器上執行(Ubuntu 12.04),它運行得很好。 你能舉一些例子來產生錯誤嗎?

  2. 正如大家所說, j只是遍歷向量的變量。 length [i]是在每個位置i中保持長度為i的單詞數的向量。 例如,如果位置3的值為4,例如length [3] = 4,則意味着有4個長度為3的單詞。

最后,如果可以的話,我想給你一個提示。 為變量選擇有意義的名稱是一種很好的做法。 在這里鏈接的代碼幫助我理解了程序應該做什么。 變量名稱,長度或定義IN,OUT或LARGEST太模糊。

我希望這收集所有答案,直到現在,並幫助你更多。

暫無
暫無

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

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