奇特的结果。 #1-13 C编程语言手册

时间:2016-03-31 01:36:34

标签: c

C编程语言的问题1-13' K& R的书要求读者创建一个程序,该程序将按长度制作单词的直方图。这些单词将由用户输入。

我尝试创建一个程序来存储每个长度的字数,然后在处理直方图之前打印出每个数组块的int值。无论我多少用这个程序,它总会给我两个结果之一;要么" 1"还是我认为是阵列地址? " 6422476&#34 ;.为什么会这样?

#include <stdio.h>
#define GREATEST 10

int main(void){
    int c, word=0;
    int word_count[GREATEST];

    /*set all values in word_count to 0*/
    for(int i=0; i<GREATEST; i++){
        word_count[i]=0;
    }

    while((c=getchar()) != EOF){
        if(c != ' '){
            ++word;
        } else{
            word_count[word-1]=+1;
            word=0;
       }
    }

    for(int j=0; j<GREATEST; j++){
        printf("\n%d", word_count[j]);
    }
    return 0;
}

2 个答案:

答案 0 :(得分:2)

你总是得到一个很好的理由1.观察

word_count[word-1]=+1; // This assigns to the value "+1"!`

应该是

word_count[word-1]+=1; // This increments your array item`

这是一个在C中编译的bug。)。

答案 1 :(得分:0)

我使用正确的+=或“不正确的”&#39;运行您的代码。 =+并且两者都给出了相同的输出:

a bb bb ccc ccc ccc dddd dddd dddd dddd qwertyuiop eeeee

1 2 3 4 0 0 0 0 0 1

a bb bb ccc ccc ccc dddd dddd dddd dddd qwertyuiop eeeee

1 2 3 4 0 0 0 0 0 1

然而,两个都输入了输入的最后一个单词 - 对于一个5个字符长度的单词为零。我认为这是因为您退出EOF上的ctrl + D的while循环,以及自上一个空格' '未处理以来输入的内容。

此外,如果用户输入“&#39;或一组词语&#39;在多行上用空格分隔,结果不正确。这些选项&#39;输入单词会使得难以一致地处理输入。

您可能会更好地指示用户一次输入一个单词并拒绝包含空格的输入。 这样可以更轻松地控制输入并处理输入的所有单词。

这是一个使用缓冲区来保存输入的输入代码片段。 缓冲区大小,直方图数组和最大允许字长都使用静态变量maxlen设置。

/* tell user what to enter */
printf("Type one word at a time (hit enter after each word)\nType 99 to finish\n");

/* get lines of input */
while ((fgets(buff, maxlen ,stdin)) != NULL) {
    /* test for '99' end code */
    if(strncmp(buff, "99", 2) == 0) break;
    /* test for any spaces in input -if so ignore input & print message */
    if(strstr(buff, " ") != NULL ) {
        printf("Enter one word at a time - then hit enter\n");
        } else {
        /* else get size of word (-1 for newline)  & increment appropriate counter */
        length = strlen(buff) - 1;
        hist[length]++;
    }
 }

缓冲区设置如下

char *buff = malloc(maxlen + 1);
输入完成后

并且必须是免费的

free(buff);