1

test.cというプログラムと、test.inという入力ファイルがあります。入力ファイルから2つの文字列を読み取り、それらをコンソールに出力しようとしています。私はWindows7を実行していますが、gccを使用してMinGWでコンパイルしています。

これは私のファイルtest.cです:

#include <stdio.h>
main() {

    FILE *fin = fopen ("test.in", "r");
    char  *one, *two;

    fscanf(fin, "%s %s", one, two);
    printf("%s\n%s", one, two);

    fclose(fin);
    return 0;
}

そしてこれは私のファイルtest.inです:

ONE
TWO

MinGWに移動し、「gcc -o test.exe test.c」を実行すると、すべてが正常にコンパイルされますが、test.exeを実行すると、ポップアップが表示され、「test.exeが機能しなくなりました。Windowsは次のことを実行しようとしています。問題の解決策を見つけてください...」

なぜこれなのか誰か知っていますか?

4

3 に答える 3

5

fscanf渡した初期化されていないポインタに書き込んでいます。この影響は未定義ですが、クラッシュする可能性があります。呼び出す前に、char配列を割り当てる必要があります。

#define MAX_LEN (32) /* change this as required */
char one[MAX_LEN];
char two[MAX_LEN];
fscanf(fin, "%s %s", one, two);
于 2012-11-13T22:12:31.783 に答える
1

の代わりにchar* onechar one[100]または他の番号が必要です。oneまた、ユーザーはのサイズ(文字列ターミネータの場合はマイナス1)を超える文字を入力してはなりません。現在、コードはメモリ内のランダムな場所に書き込んでいます。このようなランダムなケースでは、何でも起こり得ます。

于 2012-11-13T22:13:31.863 に答える
1

文字へのポインタがありますが、文字列を格納するためのメモリが割り当てられていません。

文字配列を使用してみてください。

于 2012-11-13T22:12:48.407 に答える