4

これが私のコードです。

#include <stdlib.h>
#include <stdio.h>

int main() {
    //Vars
    FILE *fp;
    char word[9999],
        *arrayOfWords[9999];
    int wordCount = 0, i;
    //Actions
    fp = fopen("data.txt", "r");
    if(fp != NULL) {
        while(!feof(fp)) {
            fscanf(fp, "%s", word);
            arrayOfWords[wordCount] = word;
            wordCount++;
        }
        for(i = 0; i < wordCount; i++) {
            printf("%s \n", arrayOfWords[i]);
        }
    puts("");
    } else {
        puts("Cannot read the file!");
    }
    return 0;
}

テキスト ファイルからデータを読み取って配列に格納しようとしています。ループ中はすべて問題ありませんが、そこから抜け出すと、配列内の任意のインデックスの値がファイルの最後の単語で埋められます。私がやっている間違いを見つけるのを手伝ってくれる人はいますか?

データファイル:

Hello there, this is a new file.

結果:

file.
file.
file.
file.
file.
file.
file.
file.

どんな助けでも大歓迎です!

4

3 に答える 3

2

配列の個々のメンバーごとにメモリを割り当てる必要があります(mallocを使用するか、配列の2番目の次元を指定して、char代わりに型を宣言しますchar*)。あなたがすることは次のようになります:

char *s;
scanf("%s", s);

そして、これは では機能しませんC。実際、ここではポインターが初期化されていないため、UB (未定義の動作) が発生します。

編集:配列内のすべてのフィールドが代わりに配列を指すように取得します。word単語を読み取ったら、文字列に新しいメモリを割り当ててから、その中に配置する必要がありstrcpy wordます。

于 2013-02-18T16:21:53.447 に答える
1

コードには少なくとも 2 つの懸念点があります。9999 の配列であるとchar word[9999], *arrayOfWords[9999];定義します。これはひとつの懸念事項です。arrayOfWordschar pointers

もう一つのポイントはarrayOfWords[wordCount] = word;. arrayOfWordsここで新しく読み取った単語を格納するには、ポインターの配列としてスペースを割り当てる必要があります。以下のように変更されたコードを見つけてください。

int main() {
//Vars
FILE *fp;
char arrayOfWords[30];
int wordCount = 0, i;
//Actions
fp = fopen("data.txt", "r");
if(fp != NULL) {
    while(!feof(fp)) {
        fscanf(fp, "%s", &arrayOfWords[wordCount]);
        wordCount++;
    }
    puts("");
    for(i = 0; i < (wordCount - 1); i++) {
        puts(arrayOfWords[i]);
    }
puts("");
} else {
    puts("Cannot read the file!");
}
return 0;
}
于 2013-02-18T16:32:03.047 に答える
0

これ:

arrayOfWords[wordCount] = word;

現在の単語を別のストレージにコピーするのではなく、同じストレージを指す別のポインターを割り当てるだけwordです。したがって、同じ配列へのポインターの配列になりますword。ポインターではなく、単語ごとに個別にメモリを割り当て、各単語を構成する文字 (および NULL ターミネーター) をコピーする必要があります。

于 2013-02-18T16:32:36.453 に答える