8

while ループ内の switch ステートメントに関する投稿がいくつかありますが、少なくとも私が見た限りでは、C で実行されているものはありません。C++ はブール式を作成できますが、これは私が認識していますが、C では作成できません。スイッチ コントロールを含む while ループがあります。ただし、スイッチ内に break ステートメントを記述すると、ループの先頭に戻り、プログラムが永久に実行されます。私が使用する関数は無視してください。確実に機能するからです。ネスティングの取り扱いについて明確にする必要があります。ありがとう!

Here is my main.c:

while(1)
{
    printf("0) Exit\n1) List Tasks\n2) Add Task\n");                                            
    printf("3)Delete Task\n4) Add Task From File\n");                                           
    printf("What would you like to do?\n");
    fgets(buf1, 50, stdin);                                                                     
    p = atoi(buf1);
    switch(p)
    {
          case 0: 
            break;
          case 1: 
            printTaskList(pTaskList);
            break;
          case 2:
            printf("Enter task name: ");
            fgets(buf2,100,stdin);
            printf("Enter task priority: ");
            fgets(buf3,100,stdin);
            printf("Enter task start date: ");
            fgets(buf4,50,stdin);
            pTask = makeTask(buf2,buf4,buf3);
            addTaskToEnd(pTaskList,pTask);
            break;
          case 3:
            printTaskList(pTaskList);
            printf("What task would you like to delete? ");
            fgets(buf6,50,stdin);
            taskNum = atoi(buf6);
            removeTask(pTaskList,taskNum);
            break;
          case 4:
            printf("Enter the filename ");
            fgets(buf7,50,stdin);
            break;
          default:
            printf("ERROR: %d: Incorrect menu option\n", p);
     }
}
4

6 に答える 6

17

break;switch最も近いエンクロージングまたはループから抜け出します。2 つのレベルにジャンプするには、 dreaded を使用するgotoか、 を再編成してreturn、目的のセマンティクスを実現する必要があります。

while(1) {
    switch(x) {
    case 0: goto EndWhile;
    }
}
EndWhile: ;

または

void loop() {
    while(1) {
        switch(x) {
        case 0: return;
        }
    }
}
//...
loop();
//...

Cではブール式を完全に使用できますint

int quit = 0;
while(!quit) {
    switch(x) {
    case 0: quit = 1; break;
    }
}

本当に必要な場合は、C にも boolean データ型があります。

#include <stdbool.h>

bool quit = false;
while(!quit) {
    switch(x) {
    case 0: quit = true; break;
    }
}

もう 1 つのオプションは、まったく正気でない人向けです。

#include <setjmp.h>

jmp_buf jbuf;
if (!setjmp(jbuf))
    while(1) {
        switch(x) {
        case 0: longjmp(jbuf, 1);
        }
    }
于 2013-04-20T06:16:11.680 に答える
1

Cでもブール式を使用できます。1999 年の C 標準には、stdbool.hヘッダーとデータ型boolがあります。Visual Studio 2012 (!) のものなどの古い C 方言では、ブール型のデータ型がないため、代わりにプレーンな int を使用する必要があります。

int keep_looping = 1;
while (keep_looping) {
    ....
    if (....)
        keep_looping = 0;
}
于 2013-04-20T06:18:42.960 に答える
0

exit(0) を使用します。
出たいところに。

In this partcular case you have to put the condition in the while loop parameter

while ループから抜け出す他の方法は、次の returnステートメントを使用することです。ただし、これは現在の関数も終了します。

適切な解決策はgoto label;、スイッチ内で使用label: statement;し、while ループの外側で使用することです。

例えば:

while(1){
  switch(x){

   case 0:goto label;

   default:break;
   }
}
label:
printf("out of while loop");
于 2014-06-15T16:24:39.173 に答える
0

ループを終了することはありません。休憩はあなたのスイッチを壊すだけです。交換する必要があります

while(1)

while ループを終了する必要があることを意味する他の何かを使用する

于 2013-04-20T06:16:00.163 に答える
0

ブレークは switch ステートメントのみを残してから、

while(1)

永遠にループします。

于 2013-04-20T06:16:54.070 に答える
0

C++ はブール式を作成できますが、これは私が認識していますが、C では作成できません。

おー?0 == 0では、ブール式ではない場合、とは何でしょうか? 型の変数を参照している場合はbool#include <stdbool.h>.

ただし、スイッチ内に break ステートメントを記述すると、ループの先頭に戻り、プログラムが永久に実行されます。私が使用する関数は無視してください。確実に機能するからです。ネスティングの取り扱いについて明確にする必要があります。ありがとう!

いいえ、ループの先頭には戻りません。switch実行は、switch ステートメントの最後 ( es 右中括弧の直後}) から続行されます。あなたの状況では、これはloop の先頭に戻ることと機能的に同じです。

利用可能なオプションがいくつかあります。他の人は、ループを制御するために唯一の変数を使用することを提案しています。これは良い考えですが、変数がロジックに既に存在するという事実にもかかわらず、新しい変数を使用することを提案しています。この方法で問題を解決したい場合は、次のことを検討してください。

do {
    /* ... */
} while (p != 0);

または、終了する場合はメインから、または他の関数からreturn呼び出します。exit(0);余分なクリーンアップ/出力コードを実行したい場合、これはそれほど役に立ちません。

このシナリオでは、制御構造は//ブランチswitchのチェーンよりも優れているとは言えません。//ブランチを使用すると、より簡単にループから抜けることができます。実行を他のケースに流したい場合は、制御構造を使用します。ifelse ifelseifelse ifelsebreak;switch

別のオプションとして、goto式を使用してループから抜け出し、メインの外側のラベルにすることもできます。これは、割り当てエラー後の処理やクリーンアップなど、ループからの出口点が複数ある場合に最適です。

于 2013-04-20T06:38:53.630 に答える