#7
by ソラ » 2年前
自己解決しました!
コード:
#include<stdio.h>
#include<string.h>
int MENU(int kensu); //メニューの表示
int Bytecheck(int bytesu); //バイトチェックを行う
struct ADDRESS_DATA //構造体型の定義
{
char name[50];
char jusho[50];
char denwa[50];
};
#define MAX_KENSU 10 //最大件数の定義
int main(void)
{
struct ADDRESS_DATA address[100]; //構造体変数の宣言
int i=1,kensu=0,bytesu,Nerror=0;
char name[256],jusho[256],denwa[256],x,m;
while(1){ //'Q'か'q'を入力すれば抜けれるので永久ループにする
m = MENU(kensu); //メニューの表示
//登録
if(m == '1'){
rewind(stdin); //入力エラーがあった場合前回入力した文字列のリセット
printf("名前の入力 >>");
gets_s(name,sizeof(name)); //gets_sでスペースにも対応
if(name[0] == '\0'){ //name[0]に'\0'が入っていたらcontinueで抜けてメニューを表示する
continue;
}
bytesu = strlen(name); //バイト数をstrlen関数で数える
Nerror = Bytecheck(bytesu); //バイト数のチェックをする
if(Nerror == -1){ //入力エラーがあったらcontinueで抜けてメニューを表示する
rewind(stdin);
continue;
}
rewind(stdin);
printf("住所の入力 >>");
gets_s(jusho,sizeof(jusho));
if(name[0] == '\0'){
continue;
}
bytesu = strlen(jusho);
Nerror = Bytecheck(bytesu);
if(Nerror == -1){
continue;
}
rewind(stdin);
printf("電話番号の入力>>");
gets_s(denwa,sizeof(denwa));
if(name[0] == '\0'){
continue;
}
bytesu = strlen(denwa);
Nerror = Bytecheck(bytesu);
if(Nerror == -1){
continue;
}
rewind(stdin);
printf("これで登録しますか?\n");
printf(" Y or N \n");
scanf("%c",&x);
if(x == 'Y' || x == 'y'){
if(kensu < MAX_KENSU){ //件数が最大件数より少ない場合
strcpy(address[i].name,name); //strcpyで文字列をアドレス帳にコピーしていく
strcpy(address[i].jusho,jusho);
strcpy(address[i].denwa,denwa);
i++;
kensu++;
}else{ //最大件数を超えたらエラーを出しメニューを表示する
printf("\n!!!!!!!最大件数エラー!!!!!!!\n");
printf("これ以上は登録できません!\n");
}
}
}
//表示
if(m == '2'){
printf("現在の登録件数は「%d」です。\n\n",kensu);
for(i=1;i<=kensu;i++){
printf("No.%d\n",i);
printf("名前 :%s\n",address[i].name);
printf("住所 :%s\n",address[i].jusho);
printf("電話番号:%s\n\n",address[i].denwa);
}
}
//終了
if(m == 'Q' || m == 'q'){
break;
}
}
return 0;
}
//メニューを表示するプログラム
int MENU(int kensu)
{
char m;
rewind(stdin); //これを入れないと余分にメニューが出てしまう
printf("アドレス帳システム ");
printf("登録件数:%03d件\n\n",kensu);
printf("1.登録\n");
printf("2.表示\n");
printf("Q.終了\n");
printf(">");
scanf("%c",&m);
return m;
}
//バイト数をチェックするプログラム
int Bytecheck(int bytesu)
{
int Nerror=0;
if(bytesu > 50){ //バイト数が50以上なら入力エラーを返す
printf("入力エラー\n");
Nerror = -1;
}
return Nerror; //Nerrorを返す
}
メニューが余分に出てきてしまう現象ですが、メニュー表示プログラムの最初に'rewind(stdin)'を入れたらなくなりました。 //これに関しては自分でも理由があんまり理解ができてないです。わかる方がいましたら説明をしていただきたいです。
リターンキーを押した場合にメニューに戻る機能ですが、
gets_sを使い、リターンキーが押されたときに'\0'を返すのでifで一文字目が'\0'かどうか判定します。
という感じでアドレス帳が一応動くようになりました。
ご回答いただいたお二方、大変ありがとうございました!
上にプログラムを載せておくので困っている方がいましたらご活用ください。
自己解決しました!
[code]
#include<stdio.h>
#include<string.h>
int MENU(int kensu); //メニューの表示
int Bytecheck(int bytesu); //バイトチェックを行う
struct ADDRESS_DATA //構造体型の定義
{
char name[50];
char jusho[50];
char denwa[50];
};
#define MAX_KENSU 10 //最大件数の定義
int main(void)
{
struct ADDRESS_DATA address[100]; //構造体変数の宣言
int i=1,kensu=0,bytesu,Nerror=0;
char name[256],jusho[256],denwa[256],x,m;
while(1){ //'Q'か'q'を入力すれば抜けれるので永久ループにする
m = MENU(kensu); //メニューの表示
//登録
if(m == '1'){
rewind(stdin); //入力エラーがあった場合前回入力した文字列のリセット
printf("名前の入力 >>");
gets_s(name,sizeof(name)); //gets_sでスペースにも対応
if(name[0] == '\0'){ //name[0]に'\0'が入っていたらcontinueで抜けてメニューを表示する
continue;
}
bytesu = strlen(name); //バイト数をstrlen関数で数える
Nerror = Bytecheck(bytesu); //バイト数のチェックをする
if(Nerror == -1){ //入力エラーがあったらcontinueで抜けてメニューを表示する
rewind(stdin);
continue;
}
rewind(stdin);
printf("住所の入力 >>");
gets_s(jusho,sizeof(jusho));
if(name[0] == '\0'){
continue;
}
bytesu = strlen(jusho);
Nerror = Bytecheck(bytesu);
if(Nerror == -1){
continue;
}
rewind(stdin);
printf("電話番号の入力>>");
gets_s(denwa,sizeof(denwa));
if(name[0] == '\0'){
continue;
}
bytesu = strlen(denwa);
Nerror = Bytecheck(bytesu);
if(Nerror == -1){
continue;
}
rewind(stdin);
printf("これで登録しますか?\n");
printf(" Y or N \n");
scanf("%c",&x);
if(x == 'Y' || x == 'y'){
if(kensu < MAX_KENSU){ //件数が最大件数より少ない場合
strcpy(address[i].name,name); //strcpyで文字列をアドレス帳にコピーしていく
strcpy(address[i].jusho,jusho);
strcpy(address[i].denwa,denwa);
i++;
kensu++;
}else{ //最大件数を超えたらエラーを出しメニューを表示する
printf("\n!!!!!!!最大件数エラー!!!!!!!\n");
printf("これ以上は登録できません!\n");
}
}
}
//表示
if(m == '2'){
printf("現在の登録件数は「%d」です。\n\n",kensu);
for(i=1;i<=kensu;i++){
printf("No.%d\n",i);
printf("名前 :%s\n",address[i].name);
printf("住所 :%s\n",address[i].jusho);
printf("電話番号:%s\n\n",address[i].denwa);
}
}
//終了
if(m == 'Q' || m == 'q'){
break;
}
}
return 0;
}
//メニューを表示するプログラム
int MENU(int kensu)
{
char m;
rewind(stdin); //これを入れないと余分にメニューが出てしまう
printf("アドレス帳システム ");
printf("登録件数:%03d件\n\n",kensu);
printf("1.登録\n");
printf("2.表示\n");
printf("Q.終了\n");
printf(">");
scanf("%c",&m);
return m;
}
//バイト数をチェックするプログラム
int Bytecheck(int bytesu)
{
int Nerror=0;
if(bytesu > 50){ //バイト数が50以上なら入力エラーを返す
printf("入力エラー\n");
Nerror = -1;
}
return Nerror; //Nerrorを返す
}
[/code]
メニューが余分に出てきてしまう現象ですが、メニュー表示プログラムの最初に'rewind(stdin)'を入れたらなくなりました。 //これに関しては自分でも理由があんまり理解ができてないです。わかる方がいましたら説明をしていただきたいです。
リターンキーを押した場合にメニューに戻る機能ですが、
gets_sを使い、リターンキーが押されたときに'\0'を返すのでifで一文字目が'\0'かどうか判定します。
という感じでアドレス帳が一応動くようになりました。
ご回答いただいたお二方、大変ありがとうございました!
上にプログラムを載せておくので困っている方がいましたらご活用ください。