0

テキスト ファイルから char 配列に行を読み込もうとしていますが、何か問題があります。コードを見て、何が間違っているのか教えてください。ありがとう。

#include <stdio.h>
#include <stdlib.h>
int main(void) {
    int i=0,j;
    char* string[100];
    char line[100];
    FILE *file; 
    file = fopen("patt", "r"); 
    while(fgets(line, sizeof line, file)!=NULL) {
        printf("%d %s",i, line);
        string[i]=line;
        i++;
    }
    for (j=0 ; j<i ; j++) {
        printf("string[%d] %s",j, string[j]);
    }
    fclose(file);
    return 0;
}

入力ファイル patt の内容は次のとおりです。

rec
cent
ece
ce
recent
nt

上記のコードを実行すると、これが得られます

0 rec
1 cent
2 ece
3 ce
4 recent
5 nt
string[0] nt
string[1] nt
string[2] nt
string[3] nt
string[4] nt
string[5] nt

私が期待するのはこれです

0 rec
1 cent
2 ece
3 ce
4 recent
5 nt
string[0] rec
string[1] cent
string[2] ece
string[3] ce
string[4] recent
string[5] nt
4

3 に答える 3

3

同じ配列に繰り返し書き込みを行っています。

while(fgets(line, sizeof line, file)!=NULL) {

この行では、配列に繰り返し書き込みますline


あなたは何をするのか誤解していると思いますchar* string[100];。実際には100個のポインターの配列ですが、配列の配列として使用しています。

この問題を解決するには、最初に反復ごとに新しいメモリ ブロックを割り当てる必要があります。

 string[i] = malloc(strlen(line)+1);

line次に、の内容をにコピーする必要がありますstring[i]

strcpy(string[i], line); 

また、プログラムの最後にfree、メモリを解放するために を使用する必要があります。

于 2013-01-20T17:12:08.920 に答える
2

あなたの意味は、同じバッファ ( ) へのポインタを の連続する各項目にstring[i]=line;繰り返し格納しているということです。このようなもの:linestring

ここに画像の説明を入力

string[i] = dupe_string(line);物事を機能させるには、次のように、それらのそれぞれに新しいバッファを割り当てる必要がありますdupe_string

char *dupe_string(char const *in) { 
    char *dupe;
    if (NULL != (dupe = malloc(strlen(in) + 1)))
        strcpy(dupe, in);
    return dupe;
}

これはmalloc各文字列にスペースを割り当てるために使用さfreeれるため、メモリリークを避けるために、最終的にはそれらのそれぞれを呼び出す必要があることに注意してください。

于 2013-01-20T17:19:14.163 に答える
1

コードの理解を助けるために:

  • 配列の内容はループ全体で変化し続けますが、毎回string[i]のアドレスに書き込みます。これにより、すべてに同じ変数のアドレスが含まれます。ループの最後に、ファイルから読み取られた最後の行が配列に格納されます。string[i] を印刷している間、変数に存在するデータを印刷しています。string[i] のすべてのインスタンスには の同じアドレスが含まれているため、それらはすべて同じ値、つまり出力に印刷されています。linelinestring[i]linelinelinelinent
int main(void) {
    int i=0,j;
    char* string[100];
    char line[100];
    FILE *file; 
    file = fopen("patt", "r"); 
    while(fgets(line, sizeof(line), file)!=NULL) {//You missed the ()'s in the sizeof
        printf("%d %s",i, line);
        string[i]=line;
        i++;
    }

*代わりにすべきことは次のとおりです。

int main(void) {
int i=0,j;
char* string[100];
char line[100];
FILE *file; 
file = fopen("patt", "r"); 
while(fgets(line, sizeof(line), file)!=NULL) {//You missed the ()'s in the sizeof
    printf("%d %s",i, line);
    string[i]=malloc(strlen(line)+1); ///You need to allocate some memory to char* string[i] here
    if(string[i] == NULL)//Do a NULL check if malloc failed
      //Handle NULL here
    strncpy(string[i],line,strlen(line)+1);//Use strncpy to copy line into the malloced memory in string[i]
    i++;
}

ここで、データを格納するためにメモリを malloc したので、メモリも解放する必要があります。したがって、コード内のこれの代わりに:

    for (j=0 ; j<i ; j++) {
        printf("string[%d] %s",j, string[j]);
    }
    fclose(file);
    return 0;
}

これを行う:

    for (j=0 ; j<i ; j++) {
    printf("string[%d] %s",j, string[j]);
    free(string[j]);
    }
   fclose(file);
   return 0;
}

これで、必要なものが得られるはずです。

于 2013-01-20T17:31:53.553 に答える