• ベストアンサー

do while

pareoparaの回答

  • pareopara
  • ベストアンサー率100% (7/7)
回答No.10

> 主旨以外のプログラムのダメだしはご遠慮ください とのことですので、無限ループに陥った原因と対策だけ書きます。 原因: scanf()の%dは数字以外の文字は取り出しません。 取り出さない文字列はずっと入力バッファに残ったままです。 そのため、一度数字以外が入力されるとa,b,cのscanf()は残っている入力バッファから値を取り出そうとします。 しかし、数字ではないので取り出さないで終わるという動きをするため、無限ループになります。 対策: 各scanf()を以下のようにエラーチェックするようにして、バッファの文字列を捨てる処理を入れてみてください。 あと、自動変数a,b,cは初期値が設定されていないので、初回のscanf()に失敗した場合、値が不定(ゴミが入っている)です。 そのため、次のif文が成立しない可能性があります。 scanf()が失敗したとき、それぞれの変数に初期値(例えば0)を入れてあげれば良いと思います。 if (scanf("%d", &a) == 0) /* 入力バッファから取り出し失敗 */ { scanf("%*s"); /* 文字列を入力バッファから破棄 */ a= 0; /* 初期値設定 */ } こんな感じでb,cについても直します。 実はこれだけではまだ不十分ですが、まずはこの形で完成を目指してください。

rigard1225
質問者

お礼

丁寧なご回答本当にありがとうございました。数字以外のキーを入力した場合は確かに僕が望んでいるとおりの結果になりました。しかしまた問題が・・・。今度は数字(1,2,3、に限らず全部の数字)を入力した場合、その後、もう一度scanfが作動してしまったようで、また入力を求められます。 ・正常な場合 (  そのまま表示する場合は1、入力し直す場合は2、終了 する場合は3を押してください。  数値入力:1 ) この場合1を入力したとして、ENTERを押したら1の結果になります。しかし ・新たな問題 (  そのまま表示する場合は1、入力し直す場合は2、終了 する場合は3を押してください。  数値入力:1  1 ) となり、もう一度数字を入力しなければなりません。 数字以外のキーを押したときは、正常に作動します。 なんとかなりませんでしょうか? しつこいようですがよろしくお願いします。

関連するQ&A

  • do while文の条件

    do while文の条件にprintfを使う場合、これはありなんでしょうか? 内容:0が入力されていたら、whileのprintfを実行してからdoに戻る。0以外ならprintfを実行しないで処理を抜ける。 int i; do { printf("0以外の数字を入力してください。\n"); scanf("%d",&i); }while(i == 0 && printf("まじめに入力してください。\n"));

  • 無限ループについて(while true~)

    たびたびお世話になります。 管理しているサーバーとデータベースの接続確認を、30分に一度行っているのですが、この際に入力していたコマンドが無限ループから抜け出すことができなくなってしまいました。 入力していたコマンドは、while true; do ./aaa.sh ; sleep 1800; doneです。 30分に一度、aaa.shを起動させて接続を確認する、というつもりで入力していたものなのですが…。 無限ループに気付き、プロセスをrootからkill(-kill) しても復活(?)してしまうようです。 このままでは問題があるため、なんとか無限ループを抜け出したいのですが、いい方法はありませんでしょうか? OSはLinuxです。 申し訳ありませんが、初心者中の初心者のため、必要な情報があまりわかりません。不足がありましたら、補足要求お願いします。

  • while文と無限ループの違い

    はじめまして。大学でC++を習い始めたばかりの初心者です。 最近while文とwhile文と使った無限ループを知ったのですが、 両者の違いがイマイチわかりません。 私のイメージですと、while文は条件が真である限り何度でも判定し 条件が偽になればループを抜ける。 一方無限ループもif文を使った条件が真にならない限りbreakしない。 while文の偽と判定する部分がif文で真と判定するだけで、同じような気がするのですが… ド素人の考えで恥ずかしいのですが、違いをわかりやすく教えてください。

  • do while 文の使い方

    #include<stdio.h> main() { int i; do{ scanf("%d",&i); }while(i%6==1,2,3,4,5); } だと6の倍数打っても終わらないのですが、 include<stdio.h> main() { int i; do{ scanf("%d",&i); }while(i%6!=0); } } だと6の倍数を入力すれば終了します。 やはり、「1,2,3,4,5」という表現ではだめなのでしょうか? 

  • 【FORTRAN77】DO WHILE文 これで正しいの?

    まったくさわったことのないFORTRAN77の解読をさせられています。 次のような場合はどうなるのでしょうか? コンパイル・実行できる環境がないので、教えて下さい。 データ数5の実数型配列をA(5)とする。 マイナスのデータは必要ないので、データ数を、今の5つから、マイナスデータを引いた数字に変更したい。 (ここでは、データ数のみを変更するものとします) N = 5 A(1) = -3. A(2) = -5. A(3) = -1. A(4) = 5. A(5) = 3. の時、次の使い方は正しく動くの? DO WHILE (A(N) .LE. 0.) N = N - 1 END DO 最初のWHILEループ N = 1から見ていって、A(1)がマイナスだから、 Nが4になる。 次のWHILEループ ・N = 4になったから、A(4)を見る? ・それともちゃんと順番にA(2)を見る? WHILEループが終わったら、ちゃんとN = 2になっている?

  • 繰り返し条件について

    do{ プログラム }while() このループの繰り返し条件に「c」が入力された時。というのを設定する事は出来ますか? 数字のやり方は分るんですが文字だとどうなるんでしょか? ただし、do-while内のさいごに条件のための入力とかをします。 C++です。 よろしくお願いします

  • while文を使った問題なのですが・・

    はじめまして。 C言語初心者です。 while文のところまでやっとたどり着きましたが、次の問題がどうしても解くことができません。 ********************** 整数を入力し、入力された整数の数だけ「*」を横一列に表示し、最後に改行するプログラムを while 文を使って作りなさい。 但し、0または負の値が入力された場合は、「*」は表示せず、改行のみを表示すること。 ********************** #include<stdio.h> int main(void) { int a; scanf("%d", &a); while(a!==0){ printf("%d*\n", a); } } こんな感じでつくってみたのですが、whileの条件部分がさっぱり分かりません。 int a の数字文だけ、*で表示する、というのも方法が思いつきません。 アドバイス、お願いいたします。

  • perlのdo-while文で抜け出せない 

    perlのwhile,do-while,last文に関する質問です。 1) code1のようなプログラムを作ったのですが   eでdo_whileを抜け出すことができませんがなぜでしょうか。 ---code1(eで抜け出せない)(NG)--- my $sum=0; do{  my $a=<STDIN>;  chomp($a);  $sum=$sum+$a; }while($a ne 'e'); print $sum; -------------------------------- 2) 抜け出す方法をいろいろ試していたら   while(1)にしてlastで抜けるようにすると   code2ではeで抜け出すことができるように   なりましたが、   do~while(1)にしたcode3では、  「Can't "last" outside a loop block at …」C   というエラーが発生します。   code2とcode3はwhileがdo~whileになって   条件を見る位置がループの始めか終わりの   違いだけなのに、なぜ、code2ではOKで、   code3ではエラーになるのでしょうか。 ---code2(eで抜け出せる)(OK)----- my $sum=0; while(1) {  my $a=<STDIN>;  chomp($a);  last if ($a eq 'e');  $sum=$sum+$a; }; print $sum; --------------------------------- ---code3(エラーになる)(NG)----- my $sum=0; do{  my $a=<STDIN>;  chomp($a);  last if ($a eq 'e');  $sum=$sum+$a; }while(1); print $sum; --------------------------------- よろしくお願いします。 Windows7 , ActivePerl(v5.16.3)

    • ベストアンサー
    • Perl
  • for文while文の無限ループの違いについて

    for文の無限ループ for(; ;) と、 while文の無限ループ while(1) は、 どのように違うのですか? 処理速度やCPU負荷を考慮して、 どちらを使用するか悩んでいます。 よろしくお願いします。

  • do-while文での無限ループ?

    こんにちは。 いつもお世話になっております。 現在Perlを使用してプログラムを組んでいますが、無限ループになってしまうらしく、次の画面に遷移しません。 @selected2には最大10個までの要素が入ります。(要素数は都度違う) その要素の中から$carno以外の要素を1つ選びたいのですが、このプログラムだとうまく動きません。 do-whileを取るととりあえずは動くので、条件の所が間違っているようなのですが、どう考えても正しいような気がします。 do{ if($ransuu==0){ $ransuu=int rand(11); } for($k=1;$k<=$a;$k++){ if($selected2[$k]==$ransuu){ $second=$ransuu; } } }while($ransuu==$carno || $second!=$ransuu); アドバイスをよろしくお願いいたします。

    • ベストアンサー
    • Perl