Y/N判定について。名簿の構造体の項目にそれぞれ内容を入力していく課題をやっています。

このQ&Aのポイント
  • C++初心者のため、続けて入力するかどうかY/Nで判断する方法を教えてほしい。
  • charでread_buff[256]を使ってY/Nの入力を受け付ける予定。
  • YまたはN以外の文字列が入力された場合は正しい入力があるまで再度入力させたい。
回答を見る
  • ベストアンサー

Y/N判定について。

名簿の構造体の項目にそれぞれ内容を入力していく課題を やっています。 今、1人分の情報が入力し終わったところまでは作ったのですが、続いて入力するかどうかY/Nで答えてもらわないといけません。 C++はすごく初心者なので、難しい関数などは使えないのです。 とりあえずcharでread_buff[256]を用意し、 printf("続けて入力しますか?(Y/Nを入力してください。)\n"); sprintf("%s"&read_buff[0]); ここまではわかりますが、この先、入力された文字列を Y/N判断する方法がわかりません。 この2つ以外が入力されたときは正しくなるまで入力させ直したいのです。 どうぞ教えてください。 よろしくお願いいたします。

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

  • ベストアンサー
noname#122067
noname#122067
回答No.2

#1です。ちょっと回答が中途半端だったので補足します。 do { printf("続けて入力しますか?(Y/Nを入力してください。)\n"); scanf("%s", &read_buff[0]); } while((read_buff[0] != 'Y') && (read_buff[0] != 'N')); if(read_buff[0] == 'Y') { /* Yを入力されたときの処理 */ } else{ /* Nを入力されたときの処理 */ }

totteoki
質問者

お礼

すごくわかりやすく、参考になりました! ありがとうございました!

その他の回答 (1)

noname#122067
noname#122067
回答No.1

do { printf("続けて入力しますか?(Y/Nを入力してください。)\n"); scanf("%s", &read_buff[0]); } while((buf[0] != 'Y') && (buf[0] != 'N')); という感じでどうでしょうか? sprintfはscanfのまちがいではありませんか?

totteoki
質問者

お礼

Scanfの間違いです。 申し訳ありません。 参考にして解いてみます。 すばやい回答をありがとうございました。

関連するQ&A

  • 助けてください。

    C言語の勉強をしているのですがうまくいきません。 助けてください。 氏名、誕生日、血液型を入力し表示する関数を作りたいです。 形としては、氏名を入力し、誕生日を入力したあとに血液型を入力する関数ですが、血液型入力を下の表を表示して選択式にしたいのです。 --------------------------- 番号を入力してください 1;A 2;B 3;O 4;AB 5;? --------------------------- ここで仮に1を入力します。 最終的に入力したものが -------------------- 名前:taro 誕生日:19830917 血液型:A -------------------- と表示されるようにしたいです。 そのための関数を作ったのですが、うまく作動しません。 どこがおかしいか教えてください。 関数はこれです。 #include<stdio.h> #include<string.h> #include<stdlib.h> int main(void) { char Buff[20]; char Buff2[9]; char Buff3[5]; char Buff4[5]; int i; char BLOODNAME[5][4] = {"A","B","O","AB","?"}; printf("名前:"); fgets(Buff,20,stdin); printf("生年月日:"); fgets(Buff2,9,stdin); i = atoi(Buff2); printf("血液型を選べ\n"); printf("------------------------------------\n"); printf("1;A 2;B 3;O 4:AB 5;?\n"); printf("------------------------------------\n"); fgets(Buff3,5,stdin); if(strlen(Buff3) == 1) { switch(Buff3[0]) { case 1: strcpy(Buff4,BLOODNAME[0]); break; case 2: strcpy(Buff4,BLOODNAME[1]); break; case 3: strcpy(Buff4,BLOODNAME[2]); break; case 4: strcpy(Buff4,BLOODNAME[3]); break; case 5: strcpy(Buff4,BLOODNAME[4]); break; default: printf("強制終了ver1\n"); return 0; } } else { printf("強制終了ver2\n"); return 0; } printf("----------------------------------------\n"); printf("名前:%s\n",Buff); printf("生年月日:%d\n",i); printf("血液型:%s\n",Buff4); printf("----------------------------------------\n"); return 0; } あと誕生日なのですが今は入力したものがそのまま出力されますが、最終的には○○○○年○○月○○日と表示されるようにしたいのですが、上の関数にどう追加すればいいのかも教えてください。 お願いいたします・

  • C言語の質問です

    キーボードから文字列を何度も入力し、入力文字数が0文字になるまで入力を繰り返し合計の文字数を表示するプログラムでなのですが。 ???の部分がわかりません 教えて頂けませんか? #include <stdio.h> #include <string.h> //関数のプロトタイプ宣言 int input(); int main(void) { int n; //入力文字数 int total; //合計文字数 for(total = 0 ; (n =??? ) != 0; total +=n ); printf("%d文字\n" , total); } int input() { char buff[80]; printf("文字列を入力:"); gets(buff); return ??? ; }

  • 文字列変換プログラムのポインタについて

    いかの関数は、文字列を16進文字列に変換する関数です。過去の質問を参考に自分で作りました。 動作することはするんですが、よく見るとpoとpiは領域確保していません。これってプログラム上まずいでしょうか。 char *conv( char *buff, char *str ) {   char *po;   char *pi;   for(po=buff, pi=str; *pi; pi++)   {     if(0 <= *pi && *pi <= 15)     {       sprintf(po, "%x", 0);       po++;       sprintf(po, "%x", *pi);       po++;     }else {       sprintf(po, "%x", (0x0f & (*pi >> 4)));       po++;       sprintf(po, "%x", (0x0f & (*pi % 16)));       po++;     }   }   *po='\0';   return(buff); }

  • 文字列入力について

    いつも大変お世話になってます。 文字列の扱いがどうも苦手なようなのでまた教えていただきに参りました。 今回は文字列の最大長を指定せずに入力時に幾らでも書けるプログラムを書きたいと思ってます。 int main() { ↓★最大長を指定しない char* buff=""; //初期化 printf("文字列入力\n"); if(gets_s(buff,sizeof(buff)-1) == NULL){ printf("NULL\n"); } ~~~~別処理~~~~ printf("%s\n", buff); return 0; } 文字列を入力したところで別処理に入る前にエラーが出て強制終了します。 aaa.exe の 0x10259554 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00415986 に書き込み中にアクセス違反が発生しました。 こういったエラーはポインタの扱い方に誤りがあるのでしょうか? また、最終的に文字列の最大長を指定せずに宣言し、入力できるように するにはどのようにしたらよろしいのでしょうか?

  • 繰り返し

    C言語を用いたプログラムの質問です。 int main(void) { char ch; check1(); for(;;){ printf("ISBNチェックを続けますか?続けるなら、y。やめるなら、nを入力してください。\n"); scanf("%c",&ch); if(ch=='y' || ch=='Y') check1(); else if(ch=='n' || ch=='N') return 0; else printf("不適切な文字が入力されました。もう一度確認します。\n"); } } yを入力したら、check1関数に飛び nを入力したら、プログラムを終了し それ以外の文字だと、再びチェックを続けるか質問する というプログラムを書きたいのですが、実際にコンパイルして実行してみると、次のようになります。 ~check1関数の処理~ ISBNチェックを続けますか?続けるなら、y。やめるなら、nを入力してください。 不適切な文字が入力されました。もう一度確認します。 ISBNチェックを続けますか?続けるなら、y。やめるなら、nを入力してください。 (入力待ち) なぜ、最初のprintf関数の次にelseの部分が処理されるのでしょうか? 『ISBNチェックを続けますか?続けるなら、y。やめるなら、nを入力してください。』の次に、入力待ちの状態にするにはどうしたらいいでしょうか?

  • UNIX関数?(popen)について

    Cプログラムでpopen関数?を使用しコマンド(rcp)を実行するプログ ラムを造ったのですが、当分が動作していたのですが、何のタイミングか分からないのですが、失敗する時が有ります。一度失敗するとそれ以降はずーと失敗します 。どのような原因が考えられるのでしょうか? ちなみにプログラムの一部をとりあえずのせておきます。(ファイル名及び相手先 のディレクトリ名は現状存在します) 又、system関数とpopen関数の大きな違いは何でしょうか? ご教示お願い致します。 (cプログラムの一部) char buff[256] ; char cmnd[256] ; /* コマンド文字列 */ int fp_rtc ; memset( buff, NULL, sizeof(buff) ) ; memset( cmnd, NULL, sizeof(cmnd) ) ; strcpy( buff, argv[1] ) ; sprintf(cmnd, RCP_FMT , buff, RCP_DIR, buff ) ; printf( "rcp cmnd ( %s )\n", cmnd ) ; fp = popen(cmnd, "r") ; fflush(stdout) ; fp_rtc = pclose(fp) ; if ( fp_rtc != 0 ){ printf( "pclose err [ rtc:%d ] \n", fp_rtc ) ; }

  • 構造体の配列 char *' 型は 'char' 型に変換できない

    大学の課題で構造体の配列の課題が出て、自分で考えてはみたもののわからないところが出たので質問させていただきます。 内容 人物の名前と年齢を入力し、表示するプログラム。 1、typedefを用いて、その構造体にpersonという名前をつける 2、main()にて以下の処理を行う。 (a)person型のサイズNの配列を用意する。 (b)N人分の名前と年齢入力して(a)で用意した配列に格納する。 (c)N人分入力後、名前と年齢を画面に表示する。 #include <stdio.h> #define ninzu 1 typedef struct{ char name[ninzu][20]; int age[ninzu]; } person; int main(void){ int i,ag[ninzu]; char nam[ninzu][20]; for(i=0;i<ninzu;i++){ printf("名前を入力\n"); scanf("%s\n",nam[i]); printf("年齢を入力\n"); scanf("%d\n",&ag[i]); } for(i=0;i<ninzu;i++){ person pro={nam[i],ag[i]}; printf("%s\n",pro.name[i]); printf("%d\n",pro.age[i]); } return(0); } 現在、↑のところまでいったのですが、 for(i=0;i<ninzu;i++){ person pro={nam[i],ag[i]}; printf("%s\n",pro.name[i]); printf("%d\n",pro.age[i]); } の部分の配列の表示の仕方がいまいちわかりません。 現在" 'char *' 型は 'char' 型に変換できない(関数 main() "のエラーが出ています。 わかり難いかもしれませんが、ご指導のほう宜しくお願いいたします。

  • While()の事でおしえてください

    名前入力関数を作ったのですが、名前の入力を確定してもWhile()から抜け出せません。 「名前を確定しました」の後に、「キャラクターの名前を入力してください」に戻ります。 あと、名前入力関数の中にWhile()を入れてみても駄目でした。 うまく処理を終わらせて、main()関数に戻れるようにするには、どうすればいいでしょうか? #pragma warning(disable : 4996) //warning C4996: 'scanf':を消すため #include <stdio.h> #include <stdlib.h> void show_title(void); //タイトル表示関数の宣言 char make_character(void); //名前入力関数の宣言 int main() { char result='n'; //初期化 show_title(); result=make_character(); while((result!='y')||(result!='Y')){ make_character(); } return 0; } void show_title(void) //タイトル表示関数 { system("cls"); //画面を初期化 system("color b"); //文字を青色にする printf("見習い魔道師の挑戦\n\n"); //タイトル表示 } char make_character(void) //名前入力関数 { char name[30]; //名前用の変数 char confirmation; //Y/N用の変数 main()に戻す値 printf("キャラクターの名前を入力してください:"); scanf("%s",name); printf("キャラクターの名前は%sでよろしいですか?(Y/N)",name); scanf("%*c%c",&confirmation); //一回目のscanf()のEnterをクリアする if((confirmation=='y')||(confirmation=='Y')){ printf("名前を確定しました\n"); return confirmation; //戻り値 } else if((confirmation=='n')||(confirmation=='N')){ printf("名前を変更します\n"); return confirmation; //戻り値 warning C4715:用 } else{ printf("Y/N以外が入力されました\n"); return confirmation; //戻り値 warning C4715:用 } }

  • C言語の標準関数についての質問です><

    C言語の標準関数についての質問です>< 実行結果が以下のようになるようにプログラムを作りたいのですが・・・・ int indat; ← 用意された変数です。 static char outbuf[101]; ←用意された変数です。 使える標準関数は、 sprintf関数と、strlen関数です。 実行結果 数値入力==>123 数値入力==>45 数値入力==>6789 数値入力==>0 数値入力==>-1 文字列連結=123△45△6789△0 自分なりに書きましたが動きません>< #include <stdio.h> #include <string.h> void main(void) { int indat,i; static char outbuf[101]; i=0; while(indat >= 0) { printf("数値入力==>"); scanf("%d",&indat); sprintf(&outbuf[i],"%d",indat); i=strlen(outbuf); } printf("文字列連結",outbuf); return; } 表示の△は空白です>< どなたか、プログラムを教えてください><

  • バイナリファイルの操作(配列の操作について)

    こんにちは。 大変お世話になっております。 配列要素の先頭[0]から[5]までを文字列N、[6]から[1029]までをバイナリデータの計1030バイトの配列要素を使用しています。 [現在行なっている操作方法] 1. Buf[1500]とBuff[1500]を用意 2. fread関数により、Bufに1024バイトずつ格納 3. sprintf関数により、Buffの先頭[0]から[5]まで文字列挿入 4. strcat関数により、BuffとBufを結合 と言う形をとっています。 そこで、sprintfにて先頭から[5]までの文字列を挿入後、先頭から[5]までの配列要素を削除(不要になるため)し、バイナリデータのみにしたいのですが、何か方法はありますでしょうか? NNNNNNDDDDDDDDDDDDDDDDD・・・・・DDDDD←1029番 から NNNNNNを削除し、 DDDDDDD・・・・・DDDDD のみにしたいと思っています。 よろしくお願いします。

専門家に質問してみよう