使默认语句不退出(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) {

我是C编程的初学者,我正在尝试做一些基本的东西。我正在尝试使用
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值。