-1

ファイルから連続する行を読み取り、文字列の配列へのポインターでそれらを指そうとしています。ただし、最初の行のみが期待どおりに出力され、その後、出力は期待どおりに表示されません。

input.txt:
Hi i am Michel
hello swing
how are you

o/p は:

LINE[1]=Hi i am Michel
st_arr[0]=Hi
st_arr[1]=i
st_arr[2]=am
st_arr[3]=Michel

LINE[2]=hello swing
st_arr[0]=Hi
LINE[3]=how are you 
st_arr[0]=Hi

これが私のコードです:

main()
{
    int i = 0,j=0,k=0,p=0;
    char lines[10][ 50];
    char words[10];
    char *st_arr[20];
    FILE *fp = fopen("input.txt", "r");
    while (fgets(lines[i], sizeof(lines[i]), fp))
    {
        lines[i][strlen(lines[i])-1] = '\0';
        i = i + 1;
    }
    fclose(fp);
    printf("The value of i=%d\n",i);
    for(j=0;j<i;j++)
    {
        printf("LINE[%d]=%s\n",j+1,lines[j]);
        {
            char *token=strtok(lines," ");
            while(token!=NULL)
            {
                st_arr[p]=malloc(strlen(token)+1);
                strcpy(st_arr[p],token);
                printf("\tst_arr[%d]=%s\n",p,token);
                token=strtok(NULL," ");
                p++;
            }
        }

        bzero(st_arr[j],sizeof(st_arr));
        p=0;

    }
}

明らかに何かが欠けているという問題はありますか?

4

1 に答える 1

1

次の行のように見えます:

bzero(st_arr[j],sizeof(st_arr));

スタックを踏みにじるバッファオーバーフローであり、「行」バッファの一部をクリアします。

bzeroにst_arrのこれらの割り当てを消去させることによって行われるメモリリークは言うまでもありません。

st_arr[p]=malloc(strlen(token)+1);

もう1つのバグは、ファイルから読み取られた各文字列の間にnullパディングがあり、最初の文字列からstrtokすることです。

 char *token=strtok(lines," ");

これは最初のnullまでしかトークン化しないため、後続のすべての文字列が失われます。あなたが意味したかもしれません:

 char *token=strtok(lines[j]," ");
于 2013-02-08T20:26:13.533 に答える