- ベストアンサー
ポインタ配列の問題で、、。
ポインタ配列の問題ですが、このmain関数でどこかがおかしいのですが、どこをどう変更すれば正常に動作するのかわかりません。どなたかお願いします(注)string入力文字は9文字以下です。 #include <stdio.h> #define NUM 5 main(void) { char *str[NUM]; int i; for(i = 0; i < NUM; i++) { printf("string ->"); scanf("%s", str[i]); } for(i = 0; i < NUM; i++) { printf("str[%d] -> %s\n", i, str[i]); } }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No. 1 で回答された方の補足です。 char *str[NUM]; では,「char(の実体)を指すべきポインタが NUM 個」確保されるだけで,「その指す実体」はまだ与えられていません。ですから,malloc() 関数などで実体(メモリ領域)を確保して,その実体を,str[] の指す「先」としなければなりません。ですから,確保する文字数を MAXSIZE(ご質問では 9 文字ですから 10 になります)として, #define MAXSIZE 10 して,for ループの最初に, str[i] = (char *)malloc(sizeof(char) * MAXSIZE); if (str[i] == NULL) { ...(エラー処理)... } が必要なわけです。
その他の回答 (2)
- 20centuryboy
- ベストアンサー率44% (85/190)
(1)文字列を配列で扱う場合 char str[NUM]; ・・・ scanf("%s",str); (2)文字列をポインタで扱う場合 char *str; ・・・ scanf("%s",str); (1)のプログラムではキーボードから入力した文字列をstrに格納できますが、(2)ではできません。 *strにはキーボードから入力された情報のアドレスを格納するものです。 ですので(2)の方法を取られるなら1,2の方の方法でするしかありません。
お礼
ありがとうございます。助かりました。
- KAZUMI2003
- ベストアンサー率37% (77/208)
scanfで受け取る文字列の領域を確保しないといけないのではないですか? #define MASIZE 好きにしてね で、最初のforの次の行に str[i]=(char*)malloc(MAXSIXE); if(str[i]==NULL) exit(-1); とでもすれば、よいのでは?
お礼
ありがとうございます。助かりました。
お礼
ありがとうございます。助かりました。