こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

教えてください。C言語初心者です。

#include <stdio.h>
int main()
{
int sentaku,hakoA=0,hakoB,*kiroku[10];
char *name[10];
while (sentaku !=3){
printf("1:新規登録\n");
printf("2:データ確認\n");
printf("3:終了\n");
scanf("%d",&sentaku);
switch (sentaku){
case 1:
printf("登録する名前を入力してください。---");
scanf("%s",name[hakoA]);
printf("記録を入力してください。---");
scanf("%d",&kiroku[hakoA]);
printf("登録番号は%d番です。\n",hakoA);
hakoA++;
printf("登録を終了します。\n");
continue;
case 2:
if (hakoA==0){
printf("登録されてません\n");
continue;
}else{
printf("登録番号を入力して下さい。---");
scanf("%d",&hakoB);
printf("%s君で記録は%dです。\n",name[hakoB],kiroku[hakoB]);
continue;
}
case 3:
break;
default :
printf("1~3でお願いします。\n");
continue;
}
}
return 0;
}
このプログラムはコンパイルされたのですが、実行で入力してるとエラーになってしまうのです。
まだ勉強始めたばかりでちょっとなぜか解らないのです。どこかおかしいところがありましたらご教授いただけると嬉しいです。おねがいします。

投稿日時 - 2005-12-23 00:42:53

QNo.1854636

困ってます

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

>printf表示するときってどのようにしたらいいのでしょう??
そのままでいいですよ。
参考のために全部を書くと以下のような感じ。
あと、データ確認のところで入力された番号が有効な番号かどうか調べた方がいいですね。
----------------------------------------------------------------
#include <stdio.h>
int main(){
int sentaku=0,hakoA=0,hakoB,kiroku[10];
char name[10][10];
while (sentaku !=3){
printf("1:新規登録\n"
"2:データ確認\n"
"3:終了\n");
scanf("%d",&sentaku);
switch (sentaku){
case 1:
printf("登録する名前を入力してください。---");
scanf("%s",name[hakoA]);
printf("記録を入力してください。---");
scanf("%d",&kiroku[hakoA]);
printf("登録番号は%d番です。\n",hakoA);
hakoA++;
printf("登録を終了します。\n");
continue;
case 2:
if (hakoA==0){
printf("登録されてません\n");
} else {
printf("登録番号を入力して下さい。---");
scanf("%d",&hakoB);
printf("%s君で記録は%dです。\n",name[hakoB],kiroku[hakoB]);
}
continue;
case 3:
break;
default :
printf("1~3でお願いします。\n");
continue;
}
}
return 0;
}

投稿日時 - 2005-12-23 02:15:09

お礼

わわ、出来ました。すごいです。私はポインタの使い方を理解してなかったみたいですね。
あなたのような凄い方に常にご教授いただけると諦めるとか挫折みたいなのを迎えずに取り組んでいけそうです。
専門家ではなくて一般人の方なのですね。専門家の人たちはもっとすごいのかな・・・。でも、私的にはほんとに凄い人だな~っておもってます。「入力された番号が有効かどうか・・」ってところも簡単そうに解っちゃいましたね。出来たらポインタの使い方とかもご教授いただけたら・・なんてよくばっちゃいそうですけど・・・。今回のお返事本当にありがとうございました。

投稿日時 - 2005-12-23 11:17:44

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

名前の文字数が9文字を超えた場合の対策や、登録されていない番号が入力されたりした場合、10個を超える登録がされそうになった場合のチェックも入れたほうが良いですね。
scanf(3)を使っていると数字を入れるべき場所で文字を入れたりすると動きがおかしくなります。
-- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< --
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NDATA 10
char
*getline(void)
{
static char buf[BUFSIZ];
if (fgets(buf,BUFSIZ,stdin) == NULL) {
return "";
}
buf[strlen(buf)-1] = 0;
return buf;
}

int
main()
{
int sentaku = 0, hakoA = 0, hakoB, kiroku[NDATA];
char *name[NDATA];
while (sentaku != 3) {
printf("\n1:新規登録\n" "2:データ確認\n" "3:終了\n");
switch (sentaku = atoi(getline())) {
case 1:
if (hakoA >= NDATA) {
printf("これ以上登録できません。");
break;
}
printf("登録する名前を入力してください。---");
name[hakoA] = strdup(getline());
printf("記録を入力してください。---");
kiroku[hakoA] = atoi(getline());
printf("登録番号は%d番です。\n", hakoA);
hakoA++;
printf("登録を終了します。\n");
continue;
case 2:
if (hakoA == 0) {
printf("登録されてません\n");
}
else {
printf("登録番号を入力して下さい。---");
if ((hakoB = atoi(getline())) >= hakoA) {
printf("登録されてません\n");
break;
}
printf("%s君で記録は%dです。\n", name[hakoB],
kiroku[hakoB]);
}
continue;
case 3:
break;
default:
printf("1~3でお願いします。\n");
continue;
}
}
return 0;
}

投稿日時 - 2005-12-23 16:08:56

お礼

お返事ありがとうございます。うう、凄すぎてちょっと私には難しいです^^;<stdlib.h>ってちょっとまだ勉強してなくて・・。scanfの代わりにatoiなのでしょうか・・。getsでしたら確かスペースもOKって認識してるので、もしかしたらこのgetlineが代わりとか・・。
でも、この様なプログラムをいただけてとっても感謝いたします。勉強のしがいがありますし、目標もできますし、楽しみも増えますしで良い事ばかりです。
ただ、最近ポインタの使いかたを間違ってたって解ったばかりなので、ちょっとポインタの理解がいまひとつなのです。もし、また機会がありましたらポインタについてもアドバイスいただけたら嬉しいです。
ほんとにありがとうございました。

投稿日時 - 2005-12-24 00:36:54

ANo.1

int *kiroku[10];
char *name[10];
は、ともに、ポインタを10個用意するもので
int kiroku[10];
char name[10];
とは違います。
char name[10][10];
10文字分の領域を10個とかすればいいかも
あと、蛇足ですが
sentakuも初期化例えば0でして置いたほうがいいです。

投稿日時 - 2005-12-23 00:58:50

お礼

お返事ありがとうございます。実は*kiroku[10]と*name[10]っていうのは10人分の登録できるようにって感じで組んだのです。でも、なんだか私間違ってたみたいですね。[10][10]っていうのは10文字分を10個って意味だったのでしたか~。でも、printf表示するときってどのようにしたらいいのでしょう??ごめんなさい、初心者なのでちょっとどう質問したらよいのかみつからなくって。
でも、お返事いただけてうれしかったです。ありがとうございました。

投稿日時 - 2005-12-23 01:35:12