2016-11-12 7 views
-1

これはC言語の最初の1年間ですので、少し失われています。 、テキストファイルからダイナミックな文字列への行の保存

int main(){ 
char **lines; 
read(lines); 

return 0;} 

そして、私は配列から何かを印刷しようとすると、私はエラーに直面し、コードが停止します。

void read(char** lines){ 

FILE *fpointer = fopen("input1.txt","r"); 
char *p_input = (char*) malloc(sizeof(char)*200); 
int i,len; 
i=0; 

lines = malloc(sizeof(char*)); 


while(fgets(p_input,200,fpointer)){ 

    len = strlen(p_input); 
    char temp[len]; 
    strcpy(temp,p_input); 
    lines[i] = temp; 
    i++; 

} 

}

とメインで:

は私が機能を持っています次のようなもの:

printf("%s\n",lines[0]); 

あなたは何が間違っているか教えていただけますか?

+1

コードにはいくつか問題があります。この問題を解決するには、['realloc'](http://en.cppreference.com/w/c/memory/realloc)機能についてお読みください。本当に悪いもう一つの問題は、ローカル変数へのポインタを保存することです。変数 'temp'は範囲外になり、ループの繰り返しごとに存在しなくなります。文字列*とポインタを複製する必要があります。 –

答えて

0
lines = malloc(sizeof(char*)); 
... 
lines[i] = temp; 

これは間違っている、あなたはchar Sへのポインタの配列(あなたが予約する行数を知る必要があります)

char **read(void) { 
    size_t n = file_lines; 
    char **lines = malloc(sizeof(char*) * n); 
    ... 
    return lines; 
} 

int main(void) { 
    char **lines; 

    lines = read(); 
    return 0; 
} 
のようなものに

変更のための十分なスペースを持っていません

手前の行数がわからない場合は、whileループの各繰り返しでreallocを使用できます。

char **read(void) { 
    ... 
    char **lines = NULL; 
    char **tmp; 
    ... 
    while (fgets(p_input,200,fpointer)) { 
     ... 
     tmp = realloc(lines, sizeof(char *) * (i + 1)); 
     if (tmp != NULL) { 
      lines = tmp; 
     } else { 
      return NULL; 
     } 
     lines[i] = temp; 
     i++; 
    } 
    return lines; 
} 

int main(void) { 
    char **lines; 

    lines = read(); 
    if (lines == NULL) { 
     perror("read"); 
     exit(EXIT_FAILURE); 
    } 
    return 0; 
} 
+0

しかし、私は動的なままにしようとしているので、私は使用したくない:char ** lines = malloc(sizeof(char *)* MAX_LINES);この問題を回避する方法はありますか? –

+0

いいえ、 'malloc'を呼び出す前に行数を知る必要があります。代わりに、各行またはリンクリストに' realloc'があります。 –

関連する問題