0

このコードは即座にセグ フォールトを発生させます。printf を全体に配置しようとしました。int=0; 行ですが、何をしても、セグメンテーション違反以外は何も出力されません。ファイルが存在し、その場所も実行場所と同じです。ファイルには都市名が含まれており、各行に 1 つの名前があり、他には何もありません。それらを読み取って配列に格納するにはどうすればよいですか :/各都市の後に数字があった場合、読み方は同じでしょうか?

NewYork 5
LosAngeles 12
California 7

そしてコード;

    int i=0;

    char **city_names = malloc(sizeof(char*));

    FILE* fp;
    fp = fopen("abc.txt","r");

    while(!feof(fp)){

        city_names[i] = realloc(city_names[i],sizeof(char)*255);
        fscanf(fp,"%s",city_names[i]);
        i++;
    }

    fclose(fp);
4

3 に答える 3

2

malloc でメモリの char * を 1 つだけ割り当ててから、while ループでそれを超えてアクセスします。

2Dmalloc配列を作成する場合は、malloc各ポインターに、 aをそれぞれに最大文字列サイズ (yuck) にmalloc割り当てる必要があります。malloc

char **city_names = malloc(sizeof(char *) * kNumCities);

for(int i = 0; i < kNumCities; i++)
  city_names[i] = malloc(sizeof(char) * kMaxStringSize);

char city_name[3][256]または、代わりに次のようなことを行って、起動して実行します。

また、この種の読み取りは非常に危険であることも付け加えておきます。不明な量のバイトを固定バッファ サイズに読み込んでいます。読み込んだ文字列が 255 バイトを超えると、メモリが破壊されます。fread()固定サイズのバッファー タイプのソリューションを使用して(またはftell()、ファイルを作成して、効率を高めるために一度にすべてを読み取ります)、バッファーから読み取りを行う方がよいでしょう。mallocandのすべてのオーバーヘッドは言うまでもありませんrealloc(合計されます)。

于 2012-06-08T16:01:23.693 に答える
1
    int i=0;
    char **city_names = malloc(sizeof(char*));
    FILE* fp;
    fp = fopen("data.txt","r");

    while(!feof(fp)){
        city_names[i] = (char*)malloc(sizeof(char)*255);
        if(1!=fscanf(fp,"%s %*d",city_names[i]))break;
        ++i;
        city_names = (char**)realloc(city_names, (i+1)*sizeof(char*));
    }

    fclose(fp);
于 2012-06-08T17:24:38.350 に答える
1

そしてwhile(!feof(fp))論理も間違っています。空のファイルの場合でも、何かをスキャンしてインクリメントしようとしますi

C で読み取る前に EOF をテストしないでください。読み取り後にテストしてください。

C の stdin で文字を反復処理するための慣用的なコードは次のとおりです。

int c; /* NOT char. */

while ((c = getchar()) != EOF) {
  /* do something with c */
}

行を反復するには:

char line[MAXLINE];
while (fgets (line, sizeof line, stdin) != NULL) {
   /* do something with line */
}
于 2012-06-08T16:33:38.067 に答える