• ベストアンサー

構造体宣言したポインタ変数に値を代入するには?

strcpy(p -> key ,name);と打ってp -> key に入力した名前を格納したいのですがうまくいきません。 ほかにもp -> key = nameなども試してみましたがコンパイルエラーが出現してダメでした。 うまく格納できるやり方があれば教えてください。よろしくお願いします。 #include<stdio.h> #include<string.h> #define WORD_LENGTH 50 /* 文字列の最大長 */ typedef struct cell{ char key[WORD_LENGTH]; struct cell *next; /* 次のセルへのポインタ */ } CELL; void main(void) { char name[WORD_LENGTH]; CELL *p; printf("名前入力\n"); scanf("%s\n", name); strcpy(p -> key ,name); printf("%s\n", p -> key); }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

No.1のサンプル #include<stdio.h> #include <stdlib.h> /* malloc, exit */ #include<string.h> #define WORD_LENGTH 50 /* 文字列の最大長 */ #define WORD_LENGTH_STR "50" /* 文字列入力用 */ typedef struct cell{ char key[WORD_LENGTH+1]; struct cell *next; /* 次のセルへのポインタ */ } CELL; void main(void) { char name[WORD_LENGTH+1]; CELL *p; /* CELLを1個確保 */ if((p=malloc(sizeof(CELL)*1))==NULL) exit(-1); /* 入力 */ printf("名前入力\n"); scanf("%"WORD_LENGTH_STR"s\n", name); /* 代入 */ strncpy(p -> key ,name,WORD_LENGTH); p->key[WORD_LENGTH]='\0'; /* scanfで文字数指定しているのでなくても大丈夫 */ /* 表示 */ printf("%s\n", p -> key); /* 領域開放 */ free(p); }

yukikundesuyo
質問者

お礼

サンプルソース非常に参考になりました。 実際にコンパイルして実行したらよく理解できました。 本当にありがとうございます。

その他の回答 (4)

回答No.5

CELL p; printf("名前入力\n"); scanf("%s\n", name); strcpy(p -> key ,name); printf("%s\n", p -> key); でOKでは?

  • hpsk
  • ベストアンサー率40% (48/119)
回答No.3

CELL *p; というのは、CELLへのポインタ(CELLを指し示すもの)を作っているだけで、CELLそのものを作っているわけではありません。 No.2の方の回答にもありますように、 CELL cel1; とすることで、CELLそのものを作り。 CELL *p = &cel1; とすることで、p が cel1 を指すようになります。 これ以上のことは、C言語の入門書で「ポインタ」を勉強されるとよいと思います。 main関数で作るCELLが1つだけでよいなら、ここで特にmallocやポインタは必要ではなく、 CELL cel1; ... strcpy( cel1.key, name ); cel1.next = NULL; /* これも一応 */ とすればよいです。

yukikundesuyo
質問者

お礼

回答ありがとうございます。 解説を読んでよく理解することができました。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

p->とした場合、かならず、pの値が保証されている必要があります。(保証とは、正しい値が設定されていること) CELL *p;としただけでは、正しい値が設定された状態になっていません。そのためには、#1の方のようにするか、 CELL cel1; CELL *p = &cel1;のようにしてpの値を設定する必要があります。ちなみに、私の提示した方法は、コンパイルエラーをとりあえずとるための方法で、貴方が本当に望んでいることとは、違っている可能性があります。

回答No.1

pの指す先をmallocで作らないとだめじゃないでしょうか。

関連するQ&A