簡體   English   中英

努力學習C編程語言練習1-13

[英]Struggling with The C Programming Language exercise 1-13

我苦苦掙扎的練習說:“編寫一個程序以打印輸入中單詞長度的直方圖。” 到目前為止,這是我的代碼:

#include <stdio.h>  

#define IN  1
#define OUT 0

int main()
{
    int length[15];
    int i, j, k;
    i = j = k = 0;
    int count, c, state = OUT;
    for(i; i<15; i++)
        length[i] = 0;
    while ((c = getchar()) != EOF)
    {
        if ((c == '\n' || c == ' ' || c == '\t') && (state == IN))
        {
            state = OUT;
            if ((count > 0) && (count < 16))
                length[count -1]++;
            if (count >= 16)
                length[14]++;
        }
        if ((c != '\n' && c != ' ' && c != '\t') && (state == OUT))
        {
            state = IN;
            count = 0;
        }
        if (state == IN)
            count++;
    }
    for(j; j<15; j++)
    {
        printf("length %d\t",j+1);
        for(k; k<length[j]; k++)
            printf("X");
        printf("\n");
    }
    return 0;
}

當我使用如下測試運行此代碼時:

a bb ccc  
^d  

要么:

aaa bb c  
^d  

它給我一個直方圖,在第1列中只有一個“ X”。 我不知道我在做什么錯。 任何幫助或建議,將不勝感激!

編寫for循環的“正常”方法是:

for (k = 0; k < length[j]; k++)

您可以根據程序開始時設置的i = j = k = 0跳過初始化步驟。 除了大多數編譯器會在此處抱怨(發出警告)未使用的值k的事實外,更深層的問題是該循環嵌套在另一個循環中。 第一次迭代通過, k0開始,並應達到length[0] - 1 但在第二次迭代中, klength[0]並上升到length[1] - 1 ,該數字可能是一個較小的數字,因此縮短或跳過了該行的小節。 如果確實打印出來,則“ bar”(如果您會喜歡雙關語)將設置為較高,因此,每行連續的行都將縮短前一行的最大長度。

@Amadan已指出您代碼中的錯誤。

我將為您的代碼提供一些printf語句,以幫助隔離問題。

如果您不能或不熟悉調試器,我認為您需要熟悉一下。

一個窮人的調試方法是在關鍵位置插入printf語句,以了解代碼的工作方式。

#include <stdio.h>  

#define IN  1
#define OUT 0

int main()
{
    int length[15];
    int i, j, k;
    i = j = k = 0;
    int count, c, state = OUT;
    for(i; i<15; i++)
        length[i] = 0;
    while ((c = getchar()) != EOF)
    {
       printf("%c\n", c);
       printf("Came here 1.\n");
        if ((c == '\n' || c == ' ' || c == '\t') && (state == IN))
        {
           printf("Came here 2. Count= %d\n", count);
            state = OUT;
            if ((count > 0) && (count < 16))
                length[count -1]++;
            if (count >= 16)
                length[14]++;
            printf("length[%d] = %d\n", count-1, length[count-1]);
        }
        else if ((c != '\n' && c != ' ' && c != '\t') && (state == OUT))
        {
           printf("Came here 3.\n");
            state = IN;
            count = 1;
        }
        else if (state == IN)
        {
           printf("Came here 4.\n");
            count++;
        }
        else
        {
           printf("Didn't expect here.\n");
        }
    }
    for(j; j<15; j++)
    {
        printf("length %d\t",length[j]);
        for(k; k<length[j]; k++)
            printf("X");
        printf("\n");
    }
    return 0;
}

暫無
暫無

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

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