-1
#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; 
}

测试.txt:

呜呜呜呜呜呜呜呜呜呜bb

输出:

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

4 回答 4

2

编码

int word_length[12];

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

尝试访问项目 12 你会得到未定义的行为。

于 2013-03-29T05:48:56.477 回答
1

看看这个片段:

int word_length[12]; 

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

你找到错误了吗?提示:再次检查号码12和接线员<=

于 2013-03-29T05:45:03.700 回答
0

int word_length[12];这意味着它可以存储 0 到 11 的最大int12数,因此word_length[12]无法访问,因此它提供了一些垃圾值。

您需要这样做int word_length[13];,您的问题将得到解决。

于 2013-03-29T05:50:05.643 回答
0

KnR 练习 1-3

#包括

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

int main() {

    int c,我,is_first = 1,skip_space = 1,skip_tab = 0;
    长word_c = 0,word_l = 0;

    而((c = getchar())!= EOF){
        if (c != ' ' && c != '\t' && c != '\n') {
            word_l++;
            跳过空间= 0;
            如果(is_first){
                ++word_c;
                is_first = 0;
            }
            putchar(c);
        } 别的 {
            is_first = 0;
            如果(!skip_space){

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

                putchar('\n');

                跳过空间 = 1;
            }
        }
    }
}

您可以在 UNIX 上使用重定向(<、> 或 >>)来进行程序的输入和输出……不需要文件处理。

于 2013-03-29T05:51:42.423 回答