dポイントプレゼントキャンペーン実施中!

読み込んだ名前を格納できるメモリ領域をmalloc関数で確保し、名前の文字列を格納。
最大10名に達するまで名前の読み込みとメモリ領域への格納を繰り返し、読み込みが終了したら全員分の名前が格納しているアドレスと名前の文字列を出力するというプログラムを作りたいのですが自分なりのプログラムを作って見ましたが、なかなかうまくできません。

どうか、ご指摘お願いします。

#include <stdio.h>
int main(void)
{

char *name[10];

int i,j=0;
for(i=0;i<10;i++){

printf("名前を最大10人分入力してください。");
if (scanf("%s",name[i]=(char*)malloc(sizeof(char)*64)) != 1);

break;
//name[i]=(char*)malloc(sizeof(char)*64);

}
if(name==NULL){
printf("メモリが確保できません");
exit(EXIT_FAILURE);
}

for (;j < i;++j)printf("%p %s\n", name[j], name[j]);

free(name);
return 0;
}

A 回答 (4件)

> if(name[i]==NULL){


mallocしてないのにチェックしてどうするんですか…

と言うか、全然理解していないようですね。

#include <stdio.h>
int main(void)
{
 char * name[10];
 int i, j;

 printf ("名前を最大10人分入力してください。\n");

 for (i = 0; i < 10; i++)
 {
  name[i] = malloc (64);
  if (name[i] == NULL)
  {
   printf ("メモリが確保できません");
   exit (EXIT_FAILURE);
  }
  if (scanf ("%s", name[i]) != 1)
   break;
 }

 for (j = 0; j < i; j++)
 {
  printf("%p %s\n", &name[j], name[j]);
  free(name[j]);
 }

 return 0;
}

コピペするとコンパイルできないと思います。 (スペースを全角にしてます)
手打ちしてください。

なお、10件未満で終了したい場合はCtrl+Dを入力してください。
    • good
    • 1
この回答へのお礼

ご指摘ありがとうございます。

お礼日時:2016/10/17 17:13

まず単に「できない」というのは質問としてダメ. 最低限「具体的にどんな動作をするから『できない』と判断したのか」を書くべき. 「どのような動作を期待するのか」を含めて「最低限」といってもいいかもしれんけど.



でプログラムを見るわけだが
if(name[i]==NULL){
printf("メモリが確保できません");
exit(EXIT_FAILURE);
}
の部分の判定とメッセージの関係がわからない. この部分でどうして「メモリが確保できません」とわかったんですか? それと, 最後の
free(name[i]);
が何をするか理解できていますか?

あと希望する結果として挙がっている
032478324 saitou
485923djv yamada
3829ghdeg katou
の前半にある「032478324 」や「485923djv 」や「3829ghdeg 」って何なんでしょうか?

それにしても
#include <malloc.h>
っていつの時代の人間なんだろう....
    • good
    • 0
この回答へのお礼

メモリが確保できませんというのはエラー処理です。
free(name[i])はメモリの開放ということをしたいです。

また、前半にあがっている032478324などは、アドレスを自分で適当に打ったものです。

お礼日時:2016/10/17 16:11

> if (scanf("%s",name[i]=(char*)malloc(sizeof(char)*64)) != 1);


行末の ; は不要。

> if(name==NULL){
間違いです。 絶対に NULL になりません。
name[0]~name[9]それぞれ確認する必要があります。
そもそも、ここで確認するのは遅いです。
上のscanfの構文へ直接代入文も書いているところに問題があります。
mallocできなかったら、NULLがscanfへ渡されます。

> for (;j < i;++j)printf("%p %s\n", name[j], name[j]);
%p に対応する引数は void型のポインターへのポインターでなければなりません。
よって、1つ目の name[j] は &name[j] になります。

> free(name);
間違いです。 これは free できません。
name[0]~name[9]それぞれ free する必要があります。
    • good
    • 0
この回答へのお礼

実行結果としては、

名前を最大10人分入力してください

saitou
yamada
katou

032478324 saitou
485923djv yamada
3829ghdeg katou

と言う感じにしたいのですができません・・・。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <malloc.h>
int main(void)
{

char *name[10];

int i,j=0;
for(i=0;i<10;i++){


if(name[i]==NULL){
printf("メモリが確保できません");
exit(EXIT_FAILURE);
}
printf("名前を最大10人分入力してください。");
if (scanf("%s",name[i]=(char*)malloc(sizeof(char)*64)) != 1)

break;
//name[i]=(char*)malloc(sizeof(char)*64);

for ( ;j <i;++j){

printf("アドレス:%p名前: %s\n", &name[j], name[j]);
}
free(name[i]);
}
return 0;
}

お礼日時:2016/10/17 15:06

こういう書き方をすると、おそらく初心者の方はどのステップで何が起きているかがわからないでしょう。


変にまとめようとせず、一つづつの動作を単純に分かりやすくバラシて書くと何処で何をしているかが自身で読んでも分かりやすくなります。
まず、それをしてみてください。

あと、パッと目気付いたのはforループで一つづつ最大10個取得したメモリ領域の解放の仕方(free)が変です。

参考まで。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!