2017-12-07 8 views
1

練習として、Nの小文字の単語と空白のテキストファイルが与えられた場合、不揃いの配列char *en[N]が読み込まれるという単純なプログラムを作成しました。データを不揃いの配列にインポート

これは大きな問題なしで動作します。それは、不揃いの配列に入力の最後の単語のみを入力します。

#include<stdio.h> 
#include<ctype.h> 

int main(int argc, char *argv[]){ 
    int i = 0, j = 0; 
    char *en[100]; 
    char temp[20]; 

    FILE *p = fopen(argv[1], "r"); 
    char single; 

    while((single = fgetc(p)) != EOF){ 
     if(!isspace(single))   /* Temporary store a single word */ 
      temp[i++] = single; 
     else{ 
      temp[i] = '\0'; 
      en[j++] = temp;   /* Save stored word in ragged array */ 
      i = 0; 
     } 
    } 

    printf("%s\n", en[0]); /* Return the same than en[1] and en[99] */ 
    printf("%s\n", en[1]); 
    printf("%s\n", en[99]); 

    return 0; 
} 

なぜ入力ファイルの最後まで下がったのか理解できません。私は間違ったアプローチを示唆する大きな問題を検出することができません。

編集:

私のアプローチの背後にある理由は、*charの配列は、この形式で初期化することができますということでした。その私が誤って上記のエラーに変換しようとした

p[0] = "abc"; 

推論、 @コーデレドックは華麗に捕まえられた。 1つの言葉と入力の次元が関係する限り、私はそれらに多くの注意を払っていないことを認めます。練習は別のトピックに集中しています。いずれにせよ、あなたの貴重な提案をありがとう!

+0

あなたは文字列のためのスペースを割り当てておらず、それらをコピーしていません。すべて 'temp 'を指している' char * 'の配列を持っています –

+0

' char single; 'は' int single ; 'fgetcによって返される型。 –

+0

'argv [0]'を最初にチェックせずにアクセスすることは決してありません。これにより、期待されるコマンドラインパラメータが実際にユーザによって入力されたことを保証します。 – user3629249

答えて

4

あなたのキャラクターの配列はすべて同じchar配列を指しており、最後に配列の内容が最後の単語に変わります。そして、あなたはだけ最後の単語を取得します。

en[j++] = strdup(temp); 

に対する可能な解決策

en[j++] = temp; 

次に、あなたはあなたのプログラムを持っているしたい動作を実現します。

2

あなたはポインタのawesomenessを知ったばかりです、おめでとうございます!

真に、char *en[100]はポインタの配列です。 en[j++] = temp;は、最初の値tempへのポインタをポインタen[j++]に割り当てます。そして、あなたはこれを何度も何度もやります。あなたがポインタの配列で終わるという驚きはありません。すべては最後の単語の内容を保持する同じ配列tempを指しています。

これから学ぶべきこと:ポインタは単にメモリを指すだけで、en[j++] = temp;を実行するとメモリコピーは発生しません。自分でメモリを割り当てる必要がありますコピーtemp自分で新しいメモリに割り当てます。

+0

この答えが完全に正しいとしても、私はもう一方の答えに終わった。その理由は、私が実装しようとしていた手順を実際に翻訳することができたからです。いずれにしても、絶対に有効で直接的な答えは+1です! – Worice

関連する問題