• 締切済み

助けてください。

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; } あと誕生日なのですが今は入力したものがそのまま出力されますが、最終的には○○○○年○○月○○日と表示されるようにしたいのですが、上の関数にどう追加すればいいのかも教えてください。 お願いいたします・

みんなの回答

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.3

>そのための関数を作ったのですが、うまく作動しません。  お示しのソースは、「関数」を作らずに、こんな風にもかける、ということで投稿します。 「ひとりだけ」で終了ですので(のちのちに)お役に立てず、あしからず。 なお、質問者様のソースを「動く」ようにするには、 >char Buff2[ 16 ];  ・ >fgets( Buff2, 16, stdin );  ・ >if( strlen( Buff3 ) == 2 )  ・ >switch( Buff3[ 0 ] - 0x30 ) の4行を修正するだけです(出力の見栄え?は別として)。 ☆ fgets(); は、\n まで取り込むので注意が必要です。 #include<stdio.h> #include<string.h> #include<stdlib.h> int main( void ) {  char cName[20];  int iDate, iBtype;  char BLOODNAME[5][4] = { "?", "A", "B", "O", "AB" }; // 順番注意  printf( "名前:" );  scanf( "%s", &cName );  printf( "生年月日(yyyymmdd):" );  scanf( "%d", &iDate );  printf( "血液型を選べ\n" );  printf( "------------------------------------\n" );  printf( "1;A 2;B 3;O 4:AB 5;?\n" );  printf( "------------------------------------\n" );  scanf( "%d", &iBtype );  iBtype %= 5; // 0, 1, 2, 3, 4 入力ミス一部対応(例 11 とチャタリング(笑)入力)  printf( "----------------------------------------\n" );  printf( "名前:%s\n", cName );  printf( "誕生日:%d年%2d月%2d日\n", ( iDate / 10000 ), ( ( iDate / 100 ) % 100 ), ( iDate % 100 ) );  printf( "血液型:%s\n", BLOODNAME[ iBtype ] );  printf( "----------------------------------------\n" );  return( 0 ); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

すると、全ての回答が全文表示されます。
回答No.2

#include <stdio.h> int main(void) { char *bs = "19830917"; int bn = 19830917; printf("%.4s年%.2s月%s日\n", bs, bs + 4, bs + 6); printf("%d年%2d月%2d日\n", bn / 10000, bn / 100 % 100, bn % 100); return 0; }

すると、全ての回答が全文表示されます。
  • nda23
  • ベストアンサー率54% (777/1416)
回答No.1

論理を組み立てないで、やたらコーディングしてもダメです。 文字列を入力したあとから考えましょう。 (1)入力文字数≠1バイト→エラー (2)入力文字<'1' OR 入力文字>'5'→エラー (3)入力文字を数値化(例:'1'→1) (4)入力文字を数値化したもの - 1 → BLOODNAMEの1次元目インデックス 先ず、文字の'1'は数値の1ではありません。switch(Buff3[0]) で 受けるべきcaseは'1'です。よって、case 1:(誤)→case '1'(正)です。 次に、血液型の名前をせっかく2次元配列にしているのに、switch文を 使うと言うのは如何なものでしょう?誰かの丸写しでもしましたか? ここは「文字→数値」,「数値=数値-1」として使いましょう。 int idx = Buff3[0] - '0' - 1; // '0'を減じると数値になる。 strcpy(Buff4,BLOODNAME[idx]); // 配列[0]~[4]のいずれかが転写される。 ポイント (1)文字を数値化するのには他にatoiもあるが、1文字のみなら'0'を  減じるか、0x0Fと論理積を取るほうが高速 (2)年月日が文字列の(0,4)、(4,2)、(6,2)と位置長さが決まっているなら、  memmove等を使って、各データに切り分けます。  【例】    char mon[3];    memmove(mon,&Buff2[4],2);    mon[2] = 0;  http://msdn.microsoft.com/ja-jp/library/8k35d1fx.aspx (3)自動変数に初期値は取れないので、char BLOODNAME[5][4]=~ のように  コーディングすると、常にデータを転送するコードが挿入されて、  処理効率が悪いので、(もっとも、無神経な人は気にしないが…)  static 属性を付けて静的な変数として定義しましょう。

すると、全ての回答が全文表示されます。

関連するQ&A