0

私のプログラムはファイルから単語を読み取り、動的に割り当てられた配列に単語の数として格納します。

私の問題は、配列を出力するときにwhileループにいるときに、正しい単語を指しているように見えることです。コードがwhileループを通過した後、すべてのインデックスを出力すると、「ice」が最後の単語になり、その理由を調べようとしています。

FILE *fileptr=fopen("file.txt","r");

char** DataArray;
int num_of_words=0;

char str[10];

while(fscanf(fileptr,"%s",&str)!=-1)
{
    num_of_words++;
}

DataArray=(char**)malloc(num_of_words*sizeof(char*));

rewind(fileptr);

int i=0;

while(fscanf(fileptr,"%s",&str)!=-1)
{
    printf("%s",str);
    int len=strlen(str);
    printf("\t%d",len);

    DataArray[i]=(char*)malloc(len*sizeof(char));
    DataArray[i]=str;
    printf("\t%s\n",DataArray[i]);
    i++;
}

printf("\n");
//printf("%s\n",*(DataArray+2));
printf("%s\n",DataArray[0]);
printf("%s\n",DataArray[1]);
printf("%s\n",DataArray[2]);


fclose(fileptr);

出力:

apple  5   apple
mango  5   mango
ice  3   ice

ice
ice
ice
4

2 に答える 2

1

ポインタを割り当てるだけでは不十分です。特に、strがループを通過するたびに新しい値をとる場合。

DataArray[i]=(char*)malloc(len*sizeof(char));
DataArray[i]=str;
printf("\t%s\n",DataArray[i]);
i++;

strcpyすでにmallocを使用してスペースを割り当てているため、このプログラムを作成した方法を使用する必要があります。strdupを使用することもできますが、これにより動的ストレージが作成されます。それが私次第だとしたら、最初にmallocを使用して、次に、あなたが書いたように書きます。

strcpy(DataArray[i], str);

于 2013-03-10T20:30:38.643 に答える
0

DataArray[i] = malloc(len);この式では、mallocはlenバイトを割り当て、それらのバイトへのポインターを返します。そのポインタはに割り当てられDataArray[i]ます。

DataArray[i] = str;この式は、strの最初のバイトへのポインタをに割り当てますがDataArray[i]、これは期待したことではありません。あなたが得ているそのポインタを覚えていますmallocか?どこに行ったの?

strcpyこの関数は、ある配列から別の配列に文字列をコピーするように設計されているため、使用することをお勧めします。

DataArray[i] = malloc(len + 1); // remember to allow space for a '\0' terminator!
strcpy(DataArray[i], str);

ps。mallocの戻り値をキャストしたり、。を掛けたりしないでくださいsizeof (char)。コードを読みにくくすることを除いて、これらのどちらにも意味はありません。これはよくある質問で、ほとんどの本で答えられています。あなたはどの本を読んでいますか?

于 2013-03-10T20:24:17.850 に答える