1

Visual C ++ 6.0を使用していますが、以下のコードがあります。

char filename[1000], string[5];
FILE *fin;
strcpy(filename, argv[3]);
if ((fin = fopen(filename, "r")) != NULL)
{
    fgets(string, 100, fin);
    string[strlen(string)-1] = NULL;
    printf("filename = %s\n", filename);
    printf("argv[3]= %s\n", argv[3]);
    printf("string = %s\n", string);
}

argv [3]はフルパスとファイル名です(例:C:\ Users \ Desktop \ file.txt)。ファイルの内容は次のとおりです。

1
2
3

したがって、「1」は「string」変数に格納する必要があります。

ただし、4回の実行のうち約1回は、出力が得られます。

filename = C:\Users\Desktop\file.tx
argv[3] = C:\Users\Desktop\file.txt
string = <very long garbage value>

なぜ

strcpy(filename, argv[3]); 

文字列全体をコピーせず、最後の「t」が欠落していますか?そして、ファイルが存在するべきではなかったのに、なぜこの場合finがNULLではないのですか?

また、このコードはマルチスレッドプログラムに存在しますが、このコードを実行するのは1つのスレッドだけであることを追加する必要があります。

4

1 に答える 1

1
string[5];

4文字とヌルターミネータに十分なスペースしか割り当てていませんが、fgetsは最大100を読み取っています。

fgets(string, 100, fin);
于 2012-11-15T10:43:25.613 に答える