单词长度的直方图调试

时间:2013-03-29 05:42:13

标签: c

#include <stdio.h>

int main (void) { 
FILE *fp; 
fp = fopen("test.txt", "r"); 

int char_counter, i, c; 
int word_length[12]; 

char_counter = 0; 
for (i = 0; i <= 12; i++) {
    word_length[i] = 0; 
}

while ((c = getc(fp)) != EOF) {
    if (c == '\n' || c == '\t' || c == ' ')
    {
        word_length[char_counter] = word_length[char_counter] + 1;
        char_counter = 0; 
    }
    else {
        ++char_counter; 
    }
}

for (i = 0; i <= 12; i++) {
    printf("%d  %d\n", i, word_length[i]); 
}

return 0; 
}

test.txt:

  blahblahblah blahblah blah bla bl b b

输出:

0   0
1   1
2   1
3   1
4   1
5   0
6   0
7   0
8   1
9   0
10  0
11  0
12  -1 <-- ?? 

预期输出看起来相同但第12行应该有1而不是-1。我真的不明白我是怎么得到一个负数。

4 个答案:

答案 0 :(得分:2)

代码

int word_length[12];

表示列表中有12个项目编号为0 .. 11

尝试访问第12项时,您会得到未定义的行为。

答案 1 :(得分:1)

看看这个snippt:

int word_length[12]; 

char_counter = 0; 
for (i = 0; i <= 12; i++) {
    word_length[i] = 0; 
}

你找到了这个bug吗?提示:再次检查号码12和运营商<=

答案 2 :(得分:0)

您的int word_length[12];表示它可以存储0到11的最大12个int号, 因此,word_length[12]无法访问,因此它会给出一些垃圾值。

您需要执行int word_length[13];,您的问题才能得到解决。

答案 3 :(得分:0)

KnR练习1-3

#include 

#define TAB_STOP 8
#define MAX_WORD_TABS 4
#define MAX_WORD MAX_WORD_TABS * TAB_STOP

int main() {

    int c, i, is_first = 1, skip_space = 1, skip_tab = 0;
    long word_c = 0, word_l = 0;

    while ((c = getchar()) != EOF) {
        if (c != ' ' && c != '\t' && c != '\n') {
            word_l++;
            skip_space = 0;
            if (is_first) {
                ++word_c;
                is_first = 0;
            }
            putchar(c);
        } else {
            is_first = 0;
            if (!skip_space) {

                if (word_l  0; --word_l)
                    printf("|||||");                    //putchar('|');

                putchar('\n');

                skip_space = 1;
            }
        }
    }
}

您可以在UNIX上使用重定向(&lt;,&gt;或&gt;&gt;)来输入和输出程序...无需文件处理。