【问题标题】:Make default statement not exit (C)使默认语句不退出 (C)
【发布时间】:2015-11-28 10:26:00
【问题描述】:

我是 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 或case 1 发生时,我想让它仍然循环菜单,直到做出正确的输入。例如,如果我输入像“asdf”这样的随机内容,程序应该说“输入错误”,然后再次显示菜单并等待用户输入。如果用户输入“1”,程序将运行func1,然后返回菜单等待用户输入选择。

目前,当输入错误时它只是关闭程序而不是再次显示菜单,我不知道如何解决。

【问题讨论】:

  • 第二行 int check; 第三行 while(check!=1) - 未初始化的变量。至少请注意您的编译器警告。
  • 您的 return 0; 放错了位置 - 将其移至 main() 的最后一行。
  • 我的编译器没有显示此代码的任何警告/错误。使用代码块
  • 是时候启用它们了吗?
  • 我刚刚重新格式化了代码以使@PaulR 的评论更加突出。注意你的缩进。如果您遵循常规的缩进模式,您将更容易发现小错误,例如循环内的返回。绝对是visit the compiler options to turn up 编译器的报告。警告允许代码编译和运行,但会标记一些您应该注意的后果。也许你真的想做一些奇怪的事情,这就是为什么它们只是警告,但如果你没有......

标签: c input menu integer switch-statement


【解决方案1】:

您的 return 0 语句在您的 while 循环内。将其下移一行,在循环之外。

这是正确缩进很重要的原因之一。

此时,输入非数字输入会导致无限循环,因为scanf 没有读取任何内容。为了解决这个问题,你可以在调用scanf 刷新缓冲区之后循环调用getchar:

int c;
scanf(" %d", &choose);
while ((c=getchar()) != EOF && c != '\n');

【讨论】:

  • 谢谢,但是现在当我输入错误时,我的菜单会显示数百万次而不等待用户输入(无限循环)?
  • @sageb。在调用scanf() 刷新输入缓冲区后插入以下代码:int c; while ((c = getchar()) != EOF && c != '\n');
  • 谢谢!解决了我的两个问题!但我不确定 EOF 是什么,我不理解语句“c!=”它检查 getchar 是否不等于..nothing?
  • @sageb。 EOF 为 -1。这是一个在流的末尾返回的特殊值。 while 循环一直读取,直到 getchar 返回换行符或特殊 EOF 值。
【解决方案2】:

这是正确的,接近你想要的

// 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 的返回值以避免错误。

【讨论】:

    猜你喜欢
    • 2012-03-17
    • 2015-05-02
    • 1970-01-01
    • 2021-04-06
    • 2015-09-26
    • 2013-04-08
    • 2015-10-08
    • 2016-07-19
    • 1970-01-01
    相关资源
    最近更新 更多