質問: C言語で`xxxx yyyy`のような2組の文字列が複数並んだファイルを読み込み、線形リストに代入するとします。 そこで以下のコードを書いたのですが、おそらく`first`と`last`がそれぞれの行に対して同じ領域を指してしまっているので、それを使って線形リストを作っても、すべての線形リストの要素が同じ`xxxx`と`yyyy`になってしまいます。 そうすれば、ちゃんとした線形リストを作れるのでしょうか? ``` char first[MAX_NAME_LENGTH]; char last[MAX_NAME_LENGTH]; while(fscanf(fp, "%s%s", first, last)!=EOF){ //線形リストへの格納処理 } ```
回答: おそらく`node->first_name = first`のようにしていると推測します。 これは、同じバッファ`char first[MAX_NAME_LENGTH];` を指すことになるので、 最後に処理した内容を指すことになります。 なので、別の領域を用意し内容をコピーするというような処理が必要になります。 具体的には次の様にします。 (非標準関数`strdup`が利用できるのであれば単に`node->first_name =strdup(first);`のようにできます。) ``` char *temp = malloc(strlen(first)+1);//別の領域を確保し if(temp == NULL){ fprintf(stderr, "mallocに失敗しました\n"); exit(EXIT_FAILURE); } strcpy(temp, first);//そこにコピーする node->first_name = temp; ``` ※malloc(strdupも同じ)で確保した領域は後で自分で開放する処理が必要です。