6.プログラムの制御

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文の脱出を意味します。