読み込んだ名前を格納できるメモリ領域を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;
}
No.3ベストアンサー
- 回答日時:
> 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を入力してください。
No.4
- 回答日時:
まず単に「できない」というのは質問としてダメ. 最低限「具体的にどんな動作をするから『できない』と判断したのか」を書くべき. 「どのような動作を期待するのか」を含めて「最低限」といってもいいかもしれんけど.
でプログラムを見るわけだが
if(name[i]==NULL){
printf("メモリが確保できません");
exit(EXIT_FAILURE);
}
の部分の判定とメッセージの関係がわからない. この部分でどうして「メモリが確保できません」とわかったんですか? それと, 最後の
free(name[i]);
が何をするか理解できていますか?
あと希望する結果として挙がっている
032478324 saitou
485923djv yamada
3829ghdeg katou
の前半にある「032478324 」や「485923djv 」や「3829ghdeg 」って何なんでしょうか?
それにしても
#include <malloc.h>
っていつの時代の人間なんだろう....
メモリが確保できませんというのはエラー処理です。
free(name[i])はメモリの開放ということをしたいです。
また、前半にあがっている032478324などは、アドレスを自分で適当に打ったものです。
No.2
- 回答日時:
> 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 する必要があります。
実行結果としては、
名前を最大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;
}
No.1
- 回答日時:
こういう書き方をすると、おそらく初心者の方はどのステップで何が起きているかがわからないでしょう。
変にまとめようとせず、一つづつの動作を単純に分かりやすくバラシて書くと何処で何をしているかが自身で読んでも分かりやすくなります。
まず、それをしてみてください。
あと、パッと目気付いたのはforループで一つづつ最大10個取得したメモリ領域の解放の仕方(free)が変です。
参考まで。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Application.ScreenUpdating = ...
-
[python] 文字列を変数名として...
-
FindFirst を複数条件で検索
-
VBAでPDFのコピーとリネームを...
-
実行時エラー 3020の対策
-
ACCESS テキストボックスを隙...
-
JSONで文字列が長い時
-
optionのselectedは更新時は効...
-
CLispのloop内の挙動について
-
16進の10進変換について
-
Pythonの疎行列を用いた要素同...
-
同じものを繰り返し表示させる
-
<SELECT>タグの折り返し
-
selectタグ内の特定のoptionの...
-
複数列を持ったリストボックス...
-
c言語 16進数の2進数への変換
-
どちのほうがすきですか?
-
sendmailで複数の宛先にメール...
-
UWSCのSELECT文の記述方法
-
10進数→2進数の出力について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Application.ScreenUpdating = ...
-
実行時エラー 3020の対策
-
【メモリ不足で落ちる(python)】
-
パイソンのクラスのブログラム
-
パイソンのクラスについて
-
vscode 文字化け
-
パイソンプログラミング
-
VBAでPDFのコピーとリネームを...
-
FindFirst を複数条件で検索
-
ACCESS テキストボックスを隙...
-
[python] 文字列を変数名として...
-
構造体の各データの表示につい...
-
vbaでxmlからNodeListでデータ...
-
UWSC:ポップアップウインドウ...
-
コンボボックスのtag情報の取得...
-
phpでボタンを押したときに変数...
-
VBAで特殊文字を出力したい
-
VBA他のブックから値のみ貼付す...
-
C++ コマンドプロンプトでの入...
-
VB6のLSETをVB2005で実現するに...
おすすめ情報