因此,当我练习switch-case块的变体时,我想尝试循环程序的Switch-Case部分,在我的试验中我无法做到这一点。我尝试使用continue,除非switch-case块在循环内,否则它不起作用。我尝试设计一个带有条件的while循环,虽然有效但不准确,因为它没有执行Case中的块,但它只是突破了switch并成功终止程序但是没有执行。我试过goto,但我相信对于使用的标签有一定的规则,到目前为止还不支持在Switch内部使用goto。 我的研究只显示人们在外部循环Switch-Case(比如一个while-loop循环中的Switch-Case或for循环等),但找不到任何试图从Switch-Case代码块中构建循环的例子。 我不介意解决方案是从开始重复代码还是从Switch-Case外部的外部点开始重复,但目的是让程序以某种方式重新执行Switch-Case而不包含相同的Switch-案例循环。 经过很长一段时间后我再次学习C编程,因此我真的对此进行了长时间的搜索,但找不到合适的结果。也许在很长一段时间后我也会进行长时间的搜索,所以我可能会失去联系。 有一个类似的问题,但用户给出和接受的解决方案表明使用do while封装开关盒而不是我想要的另一种方式。这是一个链接
C programming do while with switch case program
这是我的代码: -
#include <stdio.h>
int main()
{
int input;
printf( "4. Play game\n" ); //i have re-edited the question and shortened the code and included what I additionally tried as per the advice, to focus on the question more, w/o changing the main question .
printf( "Selection: " );
scanf( "%d", &input );
switch ( input )
{
case 4:
printf( "Thanks for playing! Taaaa\n" );
break;
default:
while(input!=4) //just a sample condition, and i know that it doesnt check for letters or characters as input, but that is not the point. I just want to see if a solution on similar thought/methodology exists.
{
printf( "no u have to give a correct input\n" );
scanf("%d", &input);
continue; // I tried a Goto and return; in this loop as well only to realize that it will not jump me out of this loop and back into the program.
}
}
return 0;
}
或者,我可以对我使用的while循环做什么,使其运行但不准确但没有错误或警告。唯一的问题是while循环,正如我前面所描述的那样,并没有在case中执行块,但它刚刚爆发。
我最初尝试附加输出图像,但由于投票失败,我的声誉似乎低于10,因此无法附上抱歉。现在再次附上。
答案 0 :(得分:2)
如果我理解正确,那么你的意思是以下
#include <stdio.h>
int main( void )
{
int input;
printf( "1. Play game\n" );
printf( "2. Design game\n" );
printf( "3. Play multiplayer\n" );
printf( "4. Exit\n" );
printf( "Selection: " );
scanf( "%d", &input );
switch ( input )
{
do
{
case 1: /* Note the colon, not a semicolon */
puts( "playgame()" );
break;
case 2:
puts( "Designgame()" );
break;
case 3:
puts( "playmultiplayer()" );
break;
case 4:
printf( "Taaaa!\n" );
break;
default:
printf( "no u have to give a correct input\n" );
printf( "Selection: " );
scanf( "%d", &input );
} while ( 1 );
}
return 0;
}
看起来更精确的代码
#include <stdio.h>
int main( void )
{
int input;
printf( "1. Play game\n" );
printf( "2. Design game\n" );
printf( "3. Play multiplayer\n" );
printf( "4. Exit\n" );
printf( "Selection: " );
scanf( "%d", &input );
switch ( input )
{
do
{
if ( input == 1 )
{
case 1: /* Note the colon, not a semicolon */
puts( "playgame()" );
break;
}
else if ( input == 2 )
{
case 2:
puts( "Designgame()" );
break;
}
else if ( input == 3 )
{
case 3:
puts( "playmultiplayer()" );
break;
}
else if ( input == 4 )
{
case 4:
printf( "Taaaa!\n" );
break;
}
else
{
default:
printf( "no u have to give a correct input\n" );
scanf( "%d", &input );
}
} while ( 1 );
}
return 0;
}
虽然它是有效的代码,但是它被混淆且不可读。
将switch语句括在do while语句中要好得多。例如
#include <stdio.h>
int main( void )
{
int input;
do
{
printf( "1. Play game\n" );
printf( "2. Design game\n" );
printf( "3. Play multiplayer\n" );
printf( "4. Exit\n" );
printf( "Selection: " );
scanf( "%d", &input );
switch ( input )
{
case 1: /* Note the colon, not a semicolon */
puts( "playgame()" );
break;
case 2:
puts( "Designgame()" );
break;
case 3:
puts( "playmultiplayer()" );
break;
case 4:
printf( "Taaaa!\n" );
break;
default:
printf( "no u have to give a correct input\n" );
break;
}
} while ( input < 1 || input > 4 );
return 0;
}
答案 1 :(得分:2)
如果您想要疯狂的代码,可以使用此代码中的变体:
#include <stdio.h>
/*
** DISCLAIMER
** This is an appalling idea - do not use it.
** But it seems to meet the criteria of SO 30553881.
** Maybe.
*/
extern void PlayGame(void);
extern void DesignGame(void);
extern void PlayMultiplayer(void);
int main(void)
{
int input;
printf("1. Play game\n");
printf("2. Design game\n");
printf("3. Play multiplayer\n");
printf("4. Exit\n");
printf("5. Auto-try-again\n");
printf("Selection: ");
if (scanf("%d", &input) == 1)
{
redo:
switch (input)
{
while (input > 0 && input != 4)
{
case 1:
PlayGame();
break;
case 2:
DesignGame();
break;
case 3:
PlayMultiplayer();
break;
case 4:
printf("Taaaa!\n");
break;
default:
printf("no u have to give a correct input\n");
break;
}
if (input != 4 && scanf("%d", &input) == 1)
goto redo;
}
}
return 0;
}
void PlayGame(void) { printf("%s called\n", __func__); }
void DesignGame(void) { printf("%s called\n", __func__); }
void PlayMultiplayer(void) { printf("%s called\n", __func__); }
请注意,案例标签后的break;
语句会导致while
循环而非switch
。您可以使用continue
代替break
,但这意味着下一次迭代将执行PlayGame()
然后退出循环(因为break
- 除非您替换break
continue
,或某种goto
或return
。
这是令人震惊的代码 - 请勿使用它!
但它确实表明你可以在C中做各种真正疯狂的事情。您可以查找Duff's Device以查看与此有些相关的合理有用的代码块(这不太合理)。
答案 2 :(得分:1)
执行此类操作的传统方法是使用简单的do..while
构造:
bool ending;
do
{
// print menu
// read input in variable
// switch on your input variable, set ending to true if supposed to end
}while(!ending);
你发现自己无法跳出嵌套的循环结构。例如,在Java中,您可以标记外部循环并执行类似break outerloop;
的操作,但据我所知,这是实现它的唯一类C语言。
所以在其他语言中你有两个选择:正确使用goto
(使用适当的块来避免跳过构造函数调用的错误)或者在单独的函数中拉出外部循环并{{ 1}}当你想要结束时(也适用于return
)。
你在你的例子中所做的一切都没有。那里根本没有循环。