C语言编写一个程序,打印输入中单词长度的直方图。我这个代码错在哪里呀,为啥不能成功呀。

C语言编写一个程序,打印输入中单词长度的直方图。我这个代码错在哪里呀,为啥不能成功呀。

img

【以下回答由 GPT 生成】

在这段代码中,存在两个错误导致不能成功运行。

错误1:在第一个while循环中,对单词长度的统计出现了问题。 错误原因:在每次读取一个字符后,单词长度的统计(i的增加和A数组的更新)应该在判断单词结束之后进行,而不是在每次读取一个字符时进行。否则,统计的单词长度将不正确。

解决方法:

while ((c = getchar()) != EOF)
{
    i = 0;
    while (c != ' ' && c != '\n' && c != '\t')
    {
        i++;
        c = getchar();  // 读取下一个字符
    }
    A[i-1]++;  // 对应长度的单词数量加1
}

错误2:在直方图打印部分存在问题。 错误原因:在打印每个长度的直方图时,循环的条件错误。应该是k < A[j],而不是k <= A[j]。因为A[j]表示长度为j+1的单词数量,而不是长度为j的单词数量。

解决方法:

printf("请打印直方图:\n");
for (j = 0; j < MAX; j++)  // 数组的序号从0开始
{
    printf("%3d: ", j + 1);  // 数组的序号从0开始,但单词字符数统计从1开始
    for (k = 0; k < A[j]; k++)  // 数组的序号从0开始,循环条件修改为k < A[j]
    {
        printf("*");
    }
    printf("\n");
}

修改完成后的代码如下:

#include<stdio.h>
#define MAX 10

int main()
{
    int c, i, j, k, r;
    int A[MAX];

    for (r = 0; r < MAX; r++)
        A[r] = 0;

    while ((c = getchar()) != EOF)
    {
        i = 0;
        while (c != ' ' && c != '\n' && c != '\t')
        {
            i++;
            c = getchar();
        }
        A[i-1]++;
    }

    printf("请打印直方图:\n");
    for (j = 0; j < MAX; j++)
    {
        printf("%3d: ", j + 1);
        for (k = 0; k < A[j]; k++)
        {
            printf("*");
        }
        printf("\n");
    }

    return 0;
}

这样修改后的代码就能够正确统计单词长度并打印直方图了。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

我认为,除了一些细节上的错误,最大的错误应该是第一个双循环里面内部的for循环中途遇见空会跳出循环使得程序无法继续运行下去,不知道我的想法对不对