• ベストアンサー

入力制御

c言語初心者です。 以下のプログラムをみてください。 #include<stdio.h> int main() { char ch[3]; fgets( ch, 3,stdin );   if(ch[0]=='3') { printf("Hello!\n"); } else if(ch[0]=='2') { puts("回る"); } else{ puts("間違いf"); } return 0; } このプログラムでは2を入力すると"回る"と表示されますが 2wでも同じように表示されてしまいます。 制限して2wで入力したら"間違い"と表示させたいのですがなかなかうまくいきません。 どなたか教えてください。

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

  • ベストアンサー
  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.3

#1さんの言うように、strcmpを使うのが手っ取り早いと思います。 if(ch[0]=='3') > if(strcmp(ch, "3") == 0) else if(ch[0]=='2') > else if(strcmp(ch, "2") == 0) とかでしょうか?

armpoint
質問者

お礼

ありがとうございます。 なんとかやってみます。

その他の回答 (2)

  • kent_a
  • ベストアンサー率18% (36/199)
回答No.2

2wと入力した場合、ch[0]='2',ch[1]='w'が入っています。 なので else if(ch[0]=='2') だと2wと入力しても'2'と判断するのですね たとえばですが ch[1]も判断するとか chのレングス(文字列長)を判断するとかですか?

armpoint
質問者

お礼

そうですね、そういった事もできるのですね。 大変参考になりました。ありがとうございました。

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.1

そりゃ1番最初の文字しか比較対象にしてないからそうなるわー。 文字列比較関数、strcmpを使ってみたら?

armpoint
質問者

お礼

なんとかやってみます。 ありがとうございました。

関連するQ&A

  • 入力されたとき,何も入力しない,もしくは20字以上だと再入力のプログラム??

    こんにちわ, 今Cの勉強をしているんですが,入力をして,何も入力しないもしくは20字以上だと再入力させるのプログラムを作りたいんですけどどうしたらよろしいでしょうか。 char sk[21]; start1: while(stdin = " puts("入力"); if ((*fgets(sk,sizeof(sk),stdin) < 0x21) || strlen(sk) >= 21 ) {   puts("error");   goto start1; } だと,20字以上のときにstdinのバッファに残ってしまってエラー表示が2度出ます。 ちなみにfflush(stdin)は使用できないANSI C規格です。 よろしくお願いします。

  • このプログラムは「こんにちは」と打つと「こんにちは、元気ですか」と返答

    このプログラムは「こんにちは」と打つと「こんにちは、元気ですか」と返答するプログラムです このプログラムを改良して「こんにちは」と打つと「こんにちは、元気ですか」と言うようなキーワードを打つ決められた回答をするようなものを増やしていきたいのですが、どのように改良すればよいでしょうか? 例えば 「寒いですね」といれると「冬だからね」となるように #include <stdio.h> #include <string.h> int reply(const char *s) { const char *reply_s[] = {"こんにちは 元気ですか?", "バイバイ", "ふ~ん?"}; if(strstr(s, "こんにちは")) puts(reply_s[0]); else if(strstr(s, "さようなら")){ puts(reply_s[1]); return 0; } else puts(reply_s[2]); return 1; } int main(void) { char s[128]; do{ char *p; fgets(s, sizeof s, stdin); if(p = strchr(s, '\n')) *p = '\0'; }while(reply(s)); return 0; }

  • 文字列の検索

    プログラミングの勉強の際に下のプログラムを作りました。 最初にある文字列を入力して、その後別の文字列を入力して、 後に入力した文字列が最初に入力した文字列に含まれていれば1、 含まれていなければ0と表示するプログラムです。 コンパイルは通るのですが、文字列を2つ入力すると 「セグメンテーション違反です」と表記されます… どこが悪いのでしょうか? どなたか解説・指摘・模範解答などおねがいします。 (使用するのは#include<stdio.h>のみ、ポインタ変数必須です) #include<stdio.h> char *mystrfin(char *a, char *b); int main(void) { char str1[100],str2[100]; printf("1>>"); fgets(str1,100,stdin); printf("2>>"); fgets(str2,100,stdin); *mystrfin(c,d); } char *mystrfin(char *a,char *b){ char *c,*d; while(*c!='\0'){ c=a; d=b; while(*c!='\0' && *d!='\0') if(*c!=*d) printf("0"); break; c++; d++; } if(*d='\0') printf("1"); a++; return a; return NULL; }

  • C言語のファイル読み込みに関して。

    英文を入力したテキストファイルを読み込むプログラムをつくっているのですが、 ファイル読み込みが上手くできません。 #include<stdio.h> main() { char filename[33]; char sty[512]; FILE *fp; printf("FILENAME: "); fgets(filename, 33, stdin); //読み込むテキストファイルを指定 fp = fopen(filename,"r"); if(fp == NULL){ printf("Can't open the file!\n"); return -1; } fgets(sty, 512, fp); fclose(fp); printf("%s\n",sty); } このプログラムなのですが、どうしても"Can't open the file!"が表示されてしまいます。 どうすればいいのでしょうか?

  • strlen

    c言語初心者です。 10文字以上入力すると警告してくれるプログラムを考えています。 一応文字数を制限するにあたりstrlenを使おうとしてるのですが 思ったように機能してくれません。 以下が私の書いたプログラムです。 void main() { char name[10]={0}; memset( name, '\0', sizeof(name) ); loop: puts("*****登録*****"); printf(" 名前 :"); fgets(name,10,stdin); //バッファクリア**// if(strchr(name,'\n') == NULL) { while(getchar() != '\n'); } if(strlen(name)>10) { puts("<<文字入力数が多すぎです>>"); fgets(name,10,stdin); //バッファクリア**// if(strchr(name,'\n') == NULL) { while(getchar() != '\n'); } system("cls"); goto loop; } else { puts("OK"); } } よろしくお願いします。

  • パイプってどうやって使うの?

    1つ目のプログラムの出力を2つ目のプログラムで受け取りたいのですが、どうすればいいですか? -- 1 -- #include <stdio.h> #include <windows.h> int main(void){     int a=0;     while(1){         fprintf(stdout,"%d\n",a++);         Sleep(1000);     }     return 0; } これを2のプログラムで受け取ります。 #include <stdio.h> int main(void){     char str[128];     while(1){         if(fgets(str,sizeof(str),stdin)==NULL)             break;     printf("%s",str);     }     return 0; } これをコマンドプロンプトで 1 | 2 と入力してみましたが、何も表示されません・・。 個別に実行すると正常に動作します。 環境はXPです。どうしたら受け渡しが出来るのでしょうか?

  • 条件演算子

    このプログラムをIF文じゃなくて条件演算子を使って書き換えることはできますか? #include <stdio.h> int main(void) { int vx; printf("整数入力しなさい:"); scanf("%d,&vx"); if(vx) puts("その数は非0");   else puts("その数は0"); return(0); }

  • バイナリ表記を表示するコードが分かりません(C言語)

    下記のプログラムはビットごとのANDを使って、 キーボードから入力された文字のASCIIコードをバイナリ表記で表示します。 #include <stdio.h> #include <conio.h> int main(void) { char ch; int i; printf("文字を入力してください: "); ch = getche(); printf("\n"); /* バイナリ表記を表示する */ for(i=128; i>0; i=i/2) if(i & ch) printf("1 "); else printf("0 "); return 0; } 【質問】 「バイナリ表記を表示する」部分のコードで、 1バイト(8bit)の最上位ビットは128(2の7乗)の重みがあり、それを初期値に与えて、 「i=i/2」で64,32,16,8,4,2,1と重みが下がっていくというのは分かりますが、 if(i & ch) で、どうして「i & ch」とすることで、バイナリ表記が表示できるのでしょうか? どなたか教えて頂けないでしょうか?お願いします。

  • 数値連続入力プログラムでの配列に格納される文字について

    -------------------------------------------------------- #include<stdio.h> int main(void) {    double sum=0.0;    double dt,x    int ret,n;    char ss[80];    ret=scanf("%lf",&dt);    while(1){       if(ret==1){          x=sum;          sum+=dt;          n=getchar();         if(n=='\n'){            printf("入力された数値=%f\n");            puts("");            sum=sum;         }         else{          printf("正しく入力してください\n");          puts("");          gets(ss);          sum=x;          dt=0.0;         }       }       else if(ret!=0){          gets(ss);          dt=0.0;          printf("正しく入力してください\n");          puts("");       }       else if(ret==EOF){          break;       }       ret=scanf("%lf",&dt);    }       printf("合計=%f\n",sum2);       return 0; } -------------------------------------------------------- 前回、「scanfの入力をgets関数で読み捨てることについて」というタイトルで数値連続加算のプログラムを作り、皆様からいろいろとアドバイスを受けた者です。 いろいろとプログラムを改良し、「Ctrl+Z」の入力でプログラムを終了しようとし、後、前のプログラムでは「10abc」などと打ち込んでも「10」は読み込んでしまうので、「10abc」などと打ち込んだ時点で、エラー表示をさせるようにしました。 ここで疑問なのですが、例えば、 ------- enter enter abc ------- と入力した場合、改行文字が配列ssに格納され、いろいろと複雑になってしまうのかと思ったのですが、ssにはしっかり「abc」だけが格納されていました。 以上のプログラムに不備がないかも含めて、何故そうなるのか教えていただけると嬉しいです。

  • 助けてください。

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

専門家に質問してみよう