• ベストアンサー

ポインタ配列の問題で、、。

ポインタ配列の問題ですが、この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]);      } }

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

  • ベストアンサー
  • elttac
  • ベストアンサー率70% (592/839)
回答No.2

 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) {   ...(エラー処理)...   } が必要なわけです。

k-haruka
質問者

お礼

ありがとうございます。助かりました。

その他の回答 (2)

回答No.3

(1)文字列を配列で扱う場合 char str[NUM]; ・・・ scanf("%s",str); (2)文字列をポインタで扱う場合 char *str; ・・・ scanf("%s",str); (1)のプログラムではキーボードから入力した文字列をstrに格納できますが、(2)ではできません。 *strにはキーボードから入力された情報のアドレスを格納するものです。 ですので(2)の方法を取られるなら1,2の方の方法でするしかありません。

k-haruka
質問者

お礼

ありがとうございます。助かりました。

回答No.1

scanfで受け取る文字列の領域を確保しないといけないのではないですか? #define MASIZE 好きにしてね で、最初のforの次の行に str[i]=(char*)malloc(MAXSIXE); if(str[i]==NULL) exit(-1); とでもすれば、よいのでは?

k-haruka
質問者

お礼

ありがとうございます。助かりました。

関連するQ&A