No.2ベストアンサー
- 回答日時:
#1です。
事情がわかりましたので、ヒントだけ。おそらく、各scanfで改行文字も一緒に読み取っていることが原因だと思われます。
(ためしに、最初のyとn以外の文字入力の際、a+Enterではなくて、abcabc+Enterとしてみてください。どんな動作をしますか?)
http://www9.plala.or.jp/sgwr-t/c/sec05.html
の「5-4.scanf()の注意事項」の箇所や、
http://wisdom.sakura.ne.jp/programming/c/c58.html
をご覧になると、今回の不具合の原因がわかります。
最初のdoループの不具合(1番目のscanf)が解消されれば、問題のscanf(2番目)の問題も解消されますよ。
なお、今回のような場合にはscanfよりも、stdio.hのgetcharや、あるいは可能であれば
conio.hのgetchやgetcheなどの使用をおすすめします。
http://www.oct.zaq.ne.jp/mizuho/webpage/anchoko/ …
などもご覧の上、研究なさってください。
また、#1での回答の主旨と重複するアドバイスになりますが、
プログラム全体を書いてから不良箇所の検証を行うよりも、
たとえば今回の場合最初のdoループの文字読み取り機能が確実なことをコンパイルして動作確認した上で、次の機能を書く、ということを繰り返すほうが、問題箇所を突き止めやすく、また言語の学習にもなると思います。
参考になりましたら幸いです。
何度もありがとうございます。
owlcityさんのおっしゃる通りでした。abcabc+Enterと入力してみて目からウロコが落ちるようでした。
URLやアドバイスもとても参考になります。
助かりました。
No.3
- 回答日時:
{}の組み合わせがおかしいような気がします。
あと、scanfで一文字入力するところで、改行が入力されているのが2回回る原因じゃないかと思います。
%*cで一文字(改行分)を捨ててみてはどうでしょう。
-----------------------------------------------------------
#include <stdio.h>
int main(void){
char q,a,f;
printf("プログラムを実行しますか?\n");
do{
printf("y(yes)かn(no)を入力してください。");
scanf("%c%*c",&q);
}while(q!='y' && q!='n');
if(q=='n'){
printf("プログラムを終了します。");
}else{
do{
do{
printf("AからHまでで、好きなものを選んで大文字で入力してください。\n");
scanf("%c%*c",&a);
}while(!(a>='A' && a<='H'));
switch(a){
case 'A':
printf("文A");
break;
case 'B':
printf("文B");
break;
case 'C':
printf("文C");
break;
case 'D':
printf("文D");
break;
case 'E':
printf("文E");
break;
case 'F':
printf("文F");
break;
default:
printf("文X");
break;
}
printf("\nもう一度やりますか?");
do{
printf("\nc(続ける)かe(やめる)を入力してください。");
scanf("%c%*c",&f);
}while(f!='c' && f!='e');
} while(f!='e');
}
return 0;
}
実は自分が読んでいるテキストに改行分の一文字を捨てるという説明がどこにも書いてなかったもので、今回初めて知りました。
%*cを加えたらうまくいきました。
本当にありがとうございました。
No.1
- 回答日時:
こんにちは。
どのようにCで書いておられるのかが具体的にわからないのでなんともいえないんですが、
scanfの使い方を確認の上、
scanfの直後にprintfでそのchar変数を出力してみることをおすすめします。
この出力の確認ができてからループの検討に入るほうがよろしいかと思います。
この回答への補足
/*回答ありがとうございます。実はscanfが実行されない以外にも色々と変なことが起きるもので、具体的にソースコードを書きました。Cの練習問題として書いたものです。問題が起きるところにコメントを書いておきました。長いですが、もしよろしかったら教えてください。*/
#include <stdio.h>
int main(void)
{
char q,a,f;
printf("プログラムを実行しますか?\n");
do{
printf("y(yes)かn(no)を入力してください。");
/*下のscanfでy、n以外の文字をわざと代入するとprintfが二回実行される。*/
scanf("%c",&q);
}while(q!='y' && q!='n');
if(q=='n'){
printf("プログラムを終了します。");
}
else{
do{
printf("AからHまでで、好きなものを選んで大文字で入力してください。\n");
scanf("%c",&a);/*これが実行されない*/
while(!(a>=65 && a<=72)){
printf("\nAからHまでのアルファベットを大文字で入力してください。");
/*下のscanfでAからHまでのアルファベット以外の文字を代入するとprintfが二回実行される*/
scanf("%c",&a);
}
switch(a){
case 'A':
printf("文A");
break;
case 'B':
printf("文B");
break;
case 'C':
printf("文C");
break;
case 'D':
printf("文D");
break;
case 'E':
printf("文E");
break;
case 'F':
printf("文F");
break;
default:
printf("文X");
break;
}
printf("\nもう一度やりますか?");
do{
printf("\ne(続ける)かc(やめる)を入力してください。");/*このprintfが二回実行される*/
scanf("%c",&f);
}while(f!='c' && f!='e');
} while(f!='e');
printf("プログラムを終了します。");
}
return 0;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# C言語 3 2022/10/04 15:07
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- Java Java 南京錠 2 2023/02/04 11:46
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
getcの改行判定
-
配列を使って魔方陣
-
#if 1 #elseの意味について
-
SIGALRMでプロセス終了
-
c言語の問題
-
行列をべき乗させるプログラム
-
for文の中にswitch文はいれられ...
-
構文エラー";"が型の前にあり...
-
scanfが実行されません
-
C言語初心者です。次の問題で質...
-
C言語 数字以外を入力させない...
-
配列を関数に渡す方法
-
階乗のプログラム!!
-
c言語のプログラムで
-
プログラミングで二番目に大き...
-
c言語
-
Enterキーを押されたら次の処理...
-
#define _CRT_SECURE_NO_WARNIN...
-
信頼区間の1.96や1.65ってどこ...
-
2÷3などの余りについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
#if 1 #elseの意味について
-
for文の中にswitch文はいれられ...
-
getcの改行判定
-
C言語階乗の総和を求める
-
配列を使って魔方陣
-
while文について、c言語...
-
プログラミングで二番目に大き...
-
C言語 数字以外を入力させない...
-
c言語のwhile文を使った計算で...
-
C言語プログラムが理解できなくて…
-
配列を関数に渡す方法
-
C言語で電卓を作成する。
-
C言語の二分法のプログラムにつ...
-
c言語for文
-
scanf関数を用いての加減乗除%...
-
階乗のプログラム!!
-
計算結果がlong型以上になる場...
-
初心者です。for文、if文を使っ...
-
c言語プログラミングで1から100...
おすすめ情報