使默认语句不退出(C)
我是C编程的初学者,我正在尝试做一些基本的东西。我正在尝试使用使默认语句不退出(C),c,input,menu,integer,switch-statement,C,Input,Menu,Integer,Switch Statement,我是C编程的初学者,我正在尝试做一些基本的东西。我正在尝试使用switch语句创建一个简单的菜单,如下所示: int disp(){ int check; while(check!=1){ int choose; printf("1 \n"); printf("5quit\n"); scanf("%d", &choose); switch(choose) {
switch
语句创建一个简单的菜单,如下所示:
int disp(){
int check;
while(check!=1){
int choose;
printf("1 \n");
printf("5quit\n");
scanf("%d", &choose);
switch(choose)
{
case 1:func1();
break;
case 5: check = 1;
break;
default:
printf("wrong input");
}
return 0;
}
}
但是,当出现default
或case1
时,我想让它仍然循环菜单,直到输入正确为止。例如,如果我输入像“asdf”这样的随机信息,程序应该说“输入错误”,然后再次显示菜单,等待用户输入。如果用户输入“1”,程序将运行func1
,然后返回菜单,等待用户输入选项
目前,当出现错误输入时,它只会关闭程序而不是再次显示菜单,我不知道如何解决这个问题。您的
return 0
语句在while
循环中。将其向下移动一行,在循环之外
这就是为什么适当的压痕很重要的原因之一
此时,输入非数字输入将导致无限循环,因为scanf
没有读取任何内容。要解决此问题,请在调用scanf
以刷新缓冲区后,在循环中调用getchar
:
int c;
scanf(" %d", &choose);
while ((c=getchar()) != EOF && c != '\n');
return0
语句在while
循环中。将其向下移动一行,在循环之外
这就是为什么适当的压痕很重要的原因之一
此时,输入非数字输入将导致无限循环,因为scanf
没有读取任何内容。要解决此问题,请在调用scanf
以刷新缓冲区后,在循环中调用getchar
:
int c;
scanf(" %d", &choose);
while ((c=getchar()) != EOF && c != '\n');
这是正确的,接近你想要的
// Use a proper formatting standard to improve readability
int disp() {
int check = 0; // Initialize the loop variable
while (check != 1) {
int choose;
printf("1 \n");
printf("5quit\n");
scanf("%d\n", &choose); // Ask the scanf to swallow the newline
switch(choose) {
case 1:
func1();
break;
case 5:
check = 1;
break;
default:
printf("wrong input");
}
}
return 0; // Pull the statement out of the loop
}
编辑:由于您有意提供无效输入,因此最好检查
scanf
的返回值以避免错误。这是正确的,接近您想要的
// Use a proper formatting standard to improve readability
int disp() {
int check = 0; // Initialize the loop variable
while (check != 1) {
int choose;
printf("1 \n");
printf("5quit\n");
scanf("%d\n", &choose); // Ask the scanf to swallow the newline
switch(choose) {
case 1:
func1();
break;
case 5:
check = 1;
break;
default:
printf("wrong input");
}
}
return 0; // Pull the statement out of the loop
}
编辑:由于您有意提供无效输入,因此最好检查
scanf
的返回值以避免错误。第二行int检查代码>第三行while(检查!=1)
-未初始化变量。请至少注意编译器警告。您的返回0代码>位于错误的位置-将其移动到main()
的最后一行。我的编译器没有显示此代码的任何警告/错误。使用CodeblocksTime启用这些警告/错误?我只是重新格式化了代码,以使@PaulR的注释更加突出。注意你的缩进。如果你遵循一个规则的缩进模式,你会更容易发现一些小错误,比如循环中的返回。当然还有编译器的报告。警告允许代码编译和运行,但标记了一些您应该注意的后果。也许你真的想做一些奇怪的事情,这就是为什么它们只是警告,但如果你没有…第二行int-check代码>第三行while(检查!=1)
-未初始化变量。请至少注意编译器警告。您的返回0代码>位于错误的位置-将其移动到main()
的最后一行。我的编译器没有显示此代码的任何警告/错误。使用CodeblocksTime启用这些警告/错误?我只是重新格式化了代码,以使@PaulR的注释更加突出。注意你的缩进。如果你遵循一个规则的缩进模式,你会更容易发现一些小错误,比如循环中的返回。当然还有编译器的报告。警告允许代码编译和运行,但标记了一些您应该注意的后果。也许你真的想做一些奇怪的事情,这就是为什么它们只是警告,但是如果你没有…谢谢你,但是现在当我输入错误的输入时,我的菜单显示了数百万次,而没有等待用户输入(无限循环)?@sageb。在调用scanf()
刷新输入缓冲区后插入以下代码:int c;而((c=getchar())!=EOF&&c!='\n')代码>谢谢!解决了我的两个问题!但我不确定什么是EOF,我不理解语句“c!=”它检查getchar是否不等于..nothing?@sageb。EOF为-1。它是一个特殊的值,在流的末尾返回。while
循环会一直读取,直到getchar
返回换行符或特殊的EOF值。谢谢,但是现在当我输入错误时,我的菜单会显示数百万次,而不等待用户输入(无限循环)?@sageb。在调用scanf()
刷新输入缓冲区后插入以下代码:int c;而((c=getchar())!=EOF&&c!='\n')代码>谢谢!解决了我的两个问题!但我不确定什么是EOF,我不理解语句“c!=”它检查getchar是否不等于..nothing?@sageb。EOF为-1。它是一个特殊的值,在流的末尾返回。while
循环持续读取,直到getchar
返回换行符或特殊的EOF值。