0
char temp[100];
char event[1000];
int i = 0;

do {
    while (true) {
        **fscanf(fin, "%s", &temp);**
        if (temp != "BEGIN:VEVENT" || temp != "BEGIN:VCALENDAR") {
            strcat(event, temp);
        }

        if (temp == "END:VEVENT") {
            Events[i][0] = *event;
            i++; 
            break;
        } else if (temp == "END:VCALENDAR") {
            //temp = EOF;
            break;
        }
    }
    fprintf(stdout, "%s\n", Events[i - 1]);
} while (*temp != EOF);

アスタリスクで囲んだ行がセグを引き起こしています。障害。私の人生では、何が起こっているのか理解できません。

4

2 に答える 2

2

行が 100 文字を超える場合は、バッファ オーバーフローが発生している可能性があります。1 行の入力だけを取得する場合は、fgets代わりに次を使用します。

if(fgets(temp, sizeof(temp), fin) == NULL) {
    perror("fgets");
    /* return a failure code */
}

==また、 andを使用して文字列を比較することもできません!=。代わりに使用strcmpします。

あなたのコードtemp != "BEGIN:VEVENT"は常に true であるため (tempバッファーのアドレスが定数文字列のアドレスと等しくなることはありません)、クラッシュすると思います。そのためstrcat、バッファーのスペースがなくなるまで続行し、プログラムがバッファー オーバーフローeventしてクラッシュします。

于 2012-09-21T00:26:12.103 に答える
1

確かにその線ですか?その場合、バッファ オーバーランが発生している可能性があります。&tempまた、に渡すべきではありませんfscanf。インデックスなしで配列を使用する場合は、ポインターであると想像できます (技術的にはそうではありませんが)。したがって、代わりにこれを行う必要があります。

fscanf(fin, "%s", temp);

また、これを行います:

strcat(event, temp);

しかしevent、初期化されていません。少なくともevent文字列を終了する必要があります。そうしないと、文字列strcatの末尾を (初期化されていない値が含まれているかどうかに応じて) 配列全体を検索することになり、オーバーランする可能性があります。

char event[1000];
event[0] = 0;
于 2012-09-21T00:35:05.153 に答える