这些最后一行代码在K& S的练习1-13中做了什么? R的C编程语言?

时间:2014-10-31 23:31:55

标签: c arrays kernighan-and-ritchie

我对编程一般都很陌生,所以请注意我缺乏知识。

我现在花了几个小时进行练习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');
    
  3. 非常感谢你的帮助,如果这对社区来说太初学,我很抱歉。

1 个答案:

答案 0 :(得分:1)

好吧,试图总结所有答案,因为问题没有结束。 首先,我们需要更正 main()行:

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

int 是必要的,因为你在函数的末尾返回一个值,而 void 意味着函数没有接收任何参数。< / p>

  1. 我已经复制了你的代码并在我的机器上执行(Ubuntu 12.04),它运行得很好。你能举一些例子来产生错误吗?

  2. 正如大家所说, j 只是遍历向量的变量。 length [i] 是一个向量,在每个位置 i 保存长度为 i 的字数。例如,如果位置3的值为4,例如length [3] = 4,表示有4个单词 长度为3。

  3. 最后,如果可以的话,我想给你一个提示。为变量选择有意义的名称是一种很好的做法。您链接的代码here帮助我了解程序应该执行的操作。变量名称,长度或定义IN,OUT或LARGEST太模糊了。

    我希望到现在为止收集所有答案并帮助你更多。