• ベストアンサー

特定の文字が入力されるまで・・・

プログラムで、 A~Cの記号が選ばれるまで、 (つまり他の文字が入力されたらもう一度入力しなすようにしたい) 入力コマンドを繰り返す制御文を作りたいのですが 自分で作ってもうまくいきません。 char c; while((c=getchar())!='A'||'B'||'C'){ } 以下はA,B,Cのいずれかが入力されたら実行される制御文が続く しかし、実際はA~Cを入力しても、 次の制御文に移りません。 どこがおかしいでしょうか? また、正しく動かすにはどうすればよいでしょうか?

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

  • ベストアンサー
  • crew21
  • ベストアンサー率26% (58/222)
回答No.4

試してないけどこのコードは無限ループでしょうね。 人間の考え方と、コンピュータの考え方の違いがまさに現れてるコードに見える。 このコードは簡単に言うと、while(判定文1or判定文2or判定文3)てことです(それはわかりますか?)。 で、判定文1は今仮に置いとくとしても、判定文2と判定文3は絶対にTrueになってしまうんですよ。 それはわかりますか? 判定文というのは、要は0ならFalse、0以外ならTrueですから、判定文2に'B'という0以外の値('B'は0x42)を書いた時点で必ずTrueになってしまいます。 だから、たとえ判定文1がFalseであっても判定文2は絶対Trueになるから、判定文3は評価されることすらなく、while()の中全体の評価は必ずTrueとなってしまい、無限ループになります(次の制御文に行きません)。

tkb_ht5
質問者

お礼

ご回答ありがとうございます。 while((c=getchar())!='A'||'B'||'C') ここが変だと気づきました。 へぼミスです。 親切な回答ありがとうございました。

その他の回答 (4)

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.5

無限ループになる理由はNo4さんが回答しているので、 蛇足ですが、一度は必ず入力するならば、 int c; do{  c = getchar(); }while( c!='A' && c!='B' && c!='C' ); でいいかと。 親切なのはNo1さんのが親切かな。 ちなみに細かいですが、getcharは入力ストリームから文字を、 unsigned char型の値として読み取り、int型に変換して返してきます。

tkb_ht5
質問者

お礼

ご回答ありがとうございます。 間違えていた箇所がわかりました。 ありがとうございました。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.3

対称性が崩れてるからヤダ。

tkb_ht5
質問者

お礼

意味がわかないのですが

回答No.2

 ちょっとすっきり。 while ( (c = getchar()) != 'A' && c != 'B' && c != 'C' ) {   fprintf(stderr, "re-enter a character\n"); }

tkb_ht5
質問者

お礼

ご回答ありがとうございます。 そうですね^^

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>どこがおかしいでしょうか? 明らかに (c=getchar())!='A'||'B'||'C' ですね。 char c = getchar(); while ( c != 'A' && c != 'B' && c != 'C' ) {   fprintf(stderr, "re-enter a character\n");   c = getchar(); } という風か?

tkb_ht5
質問者

お礼

ご回答ありがとうございます。 間違っていた箇所がわかりました。

関連するQ&A

  • getcharをしながらwhile文で出力すると一つ多く出力されるので

    getcharをしながらwhile文で出力すると一つ多く出力されるのです・・・。 変な現象に遭遇しました。1文字入力して「入力した文字は~です。」とxが入力されるまで繰り返してくださいというプログラムを書きました↓ #include <stdio.h> main() { char a; do { a = getchar(); printf("入力した文字は%cです。",a); } while(a != 'x'); } ところが実行して、たとえばキーボードのaを押してenterキーを押すと 入力した文字はaです。入力した文字は です。 と表示されるのです!!「入力した文字はaです。」だけでいいのに1つ多く出力されます。このソースは間違ってますか? すみません、教えてください(涙)

  • ある特定も文字'#'が入力されるまで実行

    C言語である特定の文字#が入力されるまで 入力し、#が入力されたら、合計を出力するプログラム はどのようだと思われますか? #はgetchar()でとるのが最善でしょうか?

  • Cプログラミング(文字入力)

    getsを使って文字を入力し、while文で一文字ずつ 表示させるプログラムをつくりたいのですが、 上手く動作しません。 間違っている点を指摘頂けないでしょうか。 宜しくお願いします。 char c[11]; int i; printf("文字列を入力してください(10文字以内)\n-->"); gets(c); while(i=0;c[i]=='\0';i++){ printf("%c\n",c[i]); }

  • 文字列の検索

    プログラミングの勉強の際に下のプログラムを作りました。 最初にある文字列を入力して、その後別の文字列を入力して、 後に入力した文字列が最初に入力した文字列に含まれていれば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言語 While文(ループ)内の文字入力

    While文で、1文字入力をやれば思うようにうまくいかない。数字(データ)入力や、文字列入力の場合(%d 及び %s)ならうまくいく。文面で説明するより実際のプログラムを見た方が分かりやすいと思うので、以下にプログラムとその実行結果、実行結果に対する私が意図している結果とを示します。 【プログラム部分】 #include<stdio.h> int main(void) {    char a;    while(1)    {    printf("1文字を入力:");    scanf("%c",&a);    if(a == 'x')      break;    printf("入力したのは %c です。\n",a);    }    return 0; } 【実行結果(キーボードからは「 e 」と入力」)】 1文字を入力:e 入力したのは e です。 1文字を入力:入力したのは です。 1文字を入力: 【私が意図している結果】 1文字を入力:e 入力したのは e です。 1文字を入力:  ちなみにC言語の環境は、インターネットで無料で入手できる試食版です。(LSI C-86 Ver3.30c 試食版)  上記プログラムを見てもらえればお分かりだと思いますが、「xを入力するまで、永遠と1文字入力とその表示を行う」ことを意図しています。しかし実際の結果は意図に反しています。  1回目は正常に動作しているようですが、問題は2回目以降。scnafで入力待ちをすることなく、なぜかscanfをスルーする形で3回目のscanf入力待ちとなっています。この理由を教えてください。お願いします。

  • C++でランレングス符号化のプログラムを組みたいです。

    C++で、while,if文,char,intでランレングス符号化のプログラムを組みたいです。 たとえば、文字列aabcccと入力するとa2,b1,c3となるようにしたいです。 配列は使わずに、charで変数を二つ用意し、cinで入力、if文で判定しカウントという流れをwhileで繰り返す。そしてEOFで終了というような感じにしたいと思ってます。 よろしくお願いします。

  • 文字列の検索

    先日同じ質問をして、プログラムの内容を修正したのですが、今度は2つ文字列を入力した後0が無限にでてきます… どなたか解説・指摘・模範解答などおねがいします。 内容は最初にある文字列を入力して、その後別の文字列を入力して、 後に入力した文字列が最初に入力した文字列に含まれていれば1、 含まれていなければ0と表示するプログラムです。 (使用するのは#include<stdio.h>のみ、ポインタ変数必須です) #include<stdio.h> char *mystrfin(char *a, char *b); int main(void) { char *c,*d; 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; } 例 検索対象文字列:asdfghjkl 検索文字列:sdf 1と出力 検索対象文字列:asdfghjkl 検索文字列:qwer 0と出力

  • C言語 プログラミング 文字列

    C言語のプログラミングについての質問です。 文字列を入力して、それを逆順に表示するというプログラムを作っているのですが、 どうしても上手くいきません。 どこか間違えているのかわかりません。 わかる方いらっしゃいましたらご回答お願いします。 #include <stdio.h> int main(void) { char data[100]; int i, leng; char c; leng = 0; c =getchar(); while((c != '\n') && (c != EOF)) { data[leng] = c; leng = leng + 1; c = getchar(); } printf("%c", data[c]); return 0; }

  • 入力した数値を倍々するプログラム

     整数を1つ読み込み、それを倍々しながら10回書き出すプログラムを作成しています例えば、実行結果に3と入力すると、3、6、12、24、48、96、192・・・と書き出すものです。  for文かwhile文を使うことを指定されているんですが、どちらを使ったら良いでしょうか? for(A;B;C)のCの部分には、実行する式が入るんですよね? ただ、入れてはいけないものはありますか? 今まで、a++、a--しか見たことがないので、実行する式を入れてもエラーがでてしまいます。

  • 繰り返し文について

    まずプログラムを以下に記します。 お試しプログラムなので、実行目的は特にありません。 ---------------------------------------- //source.c #include <stdio.h> int main(void) { char ch; do{ printf("英字を一文字を入力してください\n"); ch = getchar(); printf("%c\n", ch); }while(ch != 'q'); return 0; } ---------------------------------------- 上のようなプログラムをコンパイルして実行すると、まず、 ---------------------------------------- C:\prog>sourc >文字を一文字入力してください。 ---------------------------------------- とコマンドプロンプト上に表示されると思います。そこで、 a と入力してエンターを押すと、以下のようになってしまいます。 ---------------------------------------- C:\prog>source 数字を入力してください a a 数字を入力してください 数字を入力してください ---------------------------------------- つまり、1回1文字入力しただけで、 「数字を入力してください」 が、2連続で出てしまいます。 私としては、一文字入力するたびに、1回ずつ 「数字を入力してください」 が出てほしいのです。 どうしてこのようになってしまうのでしょうか。 原因をご存じの方、教えてもらえないでしょうか。 ちなみに、実行環境は以下です。 OS:windowsVISTA 環境:Visual Studio 2008 Express Edition

専門家に質問してみよう