[英]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
的事實外,更深層的問題是該循環嵌套在另一個循環中。 第一次迭代通過, k
從0
開始,並應達到length[0] - 1
; 但在第二次迭代中, k
從length[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.