1

ファイル内の各単語の数を数えようとしています。ファイルは、stdin またはコマンド ラインで指定されたファイル名 (./count -f ) のいずれかです。これまでのところ、コマンドラインからファイルを読み取るときに、プログラムは正しい出力を提供します。しかし、標準入力から読み込もうとするとエラーが発生します。プログラムは最初に正しいものを出力し、次にセグメンテーション エラー (コア ダンプ) を返します。これが私のコードの一部です。

    FILE * fp;
int size = 20000;
char sentence[2000]; // the sentence from stdin
if ( argc != 3 ) 
{
    fgets(sentence,sizeof(sentence),stdin); // read from stdin
    fflush(stdin);
    // I think the initialization of word is incorrect, but i do know why it is incorrect
    char *word = strtok (sentence," !\"#$%&'()*+,./:;<=>?@[\\]^_`{|}~\n\t");
    while (word != NULL)
    {
        get_word(word); // get each word
        word = strtok (NULL, " !\"#$%&'()*+,./:;<=>?@[\\]^_`{|}~\n\t");
    }
}
else
{
    fp = fopen( argv[2], "r" );
    if ( fp == 0 )
    {
        printf( "Could not open file\n" );
    }

           char word[1000];
    while (readFile(fp, word, size)) {  // let the program read the file
        get_word(word); // get each word. Works well.
    }
}

get_word 関数:

void get_word(char *word){
node *ptr = NULL;
node *last = NULL;

if(first == NULL){
    first = add_to_list(word); // add to linked list
    return;
}

ptr = first;
while(ptr != NULL){
    if(strcmp(word, ptr->str) == 0){
        ++ptr->freq;
        return;
    }
    last = ptr;            
    ptr = ptr->next;  
}
last->next = add_to_list(word); // add to linked list

}

セグメンテーション違反 (コア ダンプ) が発生する理由を理解するのを手伝ってください。このプログラムは私の Mac では動作しますが、Linux では動作しません。
前もって感謝します。

4

2 に答える 2

0

文のサイズは 2 kib で、stdin から 2 kib を読んでいます。その後、文字列関数を使用します。文字列は '\0' で終わっていますが、'\0' なしで 2 つの kib データを読み取るため、string-end がないため、セグメンテーション違反が発生します。これは、文字列関数 (この場合は strtok) がおそらく 2親族。

于 2013-04-09T19:10:57.423 に答える
0

問題は

int main (int argc, char *argv[]) {
    FILE * fp;

    if ( argc != 3 )
    {
            fgets(sentence,sizeof(sentence),stdin);
            // and so on
    }
    else
    {
            fp = fopen( argv[2], "r" );
            if ( fp == 0 )
            {
                    printf( "Could not open file\n" );
            }
            while (readFile(fp, word, size)) {
                    get_word(word);
            }
    }

    // do some stuff, sorting etc.

    fclose(fp);

開封したかfclose(fp)どうかに関係なく、fpが有効なストリームに接続されていない場合、セグメンテーション違反が一般的です。どうやら一部の実装ではNULL引数をfclose適切に処理しており、それが Mac で動作しているように見える理由です。

fclose呼び出しをelseブランチに移動し、fopen失敗した場合は、

printf( "Could not open file\n" );

しかし、プログラムを終了します。

于 2013-04-09T20:03:57.630 に答える