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

test.txt:

何とか何とか何とか何とか何とかBL 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];

0 .. 11 の番号が付いたリストに 12 個の項目があることを意味します

項目 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

つまり、0 から 11 までの最大 int 値をint word_length[12];格納できるため、アクセスできないため、ガベージ値が与えられます。12word_length[12]

あなたがする必要がありint word_length[13];、あなたの問題は解決されます。

于 2013-03-29T05:50:05.643 に答える
0

KnR 演習 1-3

#含む

#TAB_STOP 8 を定義
#定義 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;
    長い word_c = 0, word_l = 0;

    while ((c = getchar()) != EOF) {
        if (c != ' ' && c != '\t' && c != '\n') {
            word_l++;
            スキップ_スペース = 0;
            if (is_first) {
                ++word_c;
                is_first = 0;
            }
            putchar(c);
        } そうしないと {
            is_first = 0;
            if (!skip_space) {

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

                putchar('\n');

                スキップ_スペース = 1;
            }
        }
    }
}

UNIX では、プログラムの入出力にリダイレクト (<、>、または >>) を使用できます... ファイル処理は必要ありません。

于 2013-03-29T05:51:42.423 に答える