6-5. break ループからの脱出
◆無限ループからの脱出
前回までで無限ループが出て来ましたが。開始があり終了がある以上、いつかはループをぬけ出さなくてはなりません。(でないと暴走する)
そのためのキーワードとしてbreakがあります。
break の働きはfor,while文中に break があるとそのループから抜け出します。
しかし、そのまま書いたのではループの意味がないので、if文と併用して使うことが一般的です。(ある条件では抜け出すという使い方)
それではブレイクします!
◇ブレイク!
まず、whileによる無限ループ
////////////////////とあるプログラムの一部////////////////////
while(1){
    printf(“終了しますか?”);
    scanf(“%c”,&c);
    }
//////////////////////////////////////////////////////////////
があります。このままでは何を入力しても無限に質問を繰り返してきます。
このあと、Y か N で答えたらループを脱出し次の処理に移るようにしたいとします。
まず、追加しなければならないのはif文です。
if(c==’Y’||c==’N’)
そして、ここにbreakを入れます。
////////////////////とあるプログラムの一部////////////////////
while(1){
    printf(“終了しますか?(Y/N)”);
    scanf(“%c”,&c);
    if(c==’Y’||c==’N’)break;
    }
//////////////////////////////////////////////////////////////
これで、一応まじめに答えることで脱出することができます。
あとは、必要な変数とバッファ処理で完成します。
#include<stdio.h>
main()
{
    char c;
    while(1){
        printf("終了しますか?(Y/N)");
        scanf("%c%*[^ \n]",&c);getchar();
        if(c=='Y'||c=='N')break;
    }
}
for文についても同じことになります。
#include<stdio.h>
main()
{
    char c;
    for(;;){
        printf("終了しますか?(Y/N)");
        scanf("%c%*[^ \n]",&c);getchar();
        if(c=='Y'||c=='N')break;
    }
}
※scanfのバッファ処理についてはNo.061(9/3)にも掲載しています。
実際に行っていいる処理は%*[^ \n]で2文字目以降の文字を無視し、getchar()で最後のCR+LF(改行)をバッファより抜き出しています。
◇スイッチ文を使うときの処理
スイッチ文で使用するとどういう働きになるでしょう。
/* スイッチ文の例 */
#include<stdio.h>
main()
{
    char c;
    printf("0から9の刻印のついたキーを押してエンターキーを");
    printf("押してください\n"); /* メールの都合上2行にしています */
    scanf("%c",&c);
    switch(c){
        case '0': printf("0のキーが押されました\n");break;
        case '1': printf("1のキーが押されました\n");break;
        case '2': printf("2のキーが押されました\n");break;
        case '3': printf("3のキーが押されました\n");break;
        case '4': printf("4のキーが押されました\n");break;
        case '5': printf("5のキーが押されました\n");break;
        case '6': printf("6のキーが押されました\n");break;
        case '7': printf("7のキーが押されました\n");break;
        case '8': printf("8のキーが押されました\n");break;
        case '9': printf("9のキーが押されました\n");break;
        default : printf("数字キー以外のキーを押されました\n");
    }
}
/* プログラムの終了 */
スイッチ文の紹介の時このように各行にbreakを付加していました。
文法的にみると別にbreak文がなくても結果は変わらないように思えます。
ですが、実はbreak文がないと次々に以下の文を実行してしまうのです。
それでは、breakをすべて省いてプログラムを実行してみます。
実行例1:(入力に1のキーを押す)
0から9の刻印のついたキーを押してエンターキーを押してください
1
1のキーが押されました
2のキーが押されました
3のキーが押されました
4のキーが押されました
5のキーが押されました
6のキーが押されました
7のキーが押されました
8のキーが押されました
9のキーが押されました
数字キー以外のキーを押されました
実行例2:(入力に5のキーを押す)
0から9の刻印のついたキーを押してエンターキーを押してください
5
5のキーが押されました
6のキーが押されました
7のキーが押されました
8のキーが押されました
9のキーが押されました
数字キー以外のキーを押されました
このようになってしまいます。だからそれぞれ違う処理を行う場合はbreakを用いる事になります。このbreakは無論switch文の脱出を意味します。
