【问题标题】:Recurring error within loop C循环 C 中的重复错误
【发布时间】:2014-10-20 18:31:39
【问题描述】:

如果输入了无效选项,我只有一个循环返回开始

    do{                     
        printf("Please enter a option, Press 'q' to quit\n"); 
        scanf("%d",&option);

        if(option == 1){
            option1(...);
            break;
        }else if(option == 2){
            option1(...);
            break;
        }else if(option == 3){
            option1(...);
            break;
        }else if(option == false){
            printf("exit\n");
            exit(EXIT_SUCCESS);
        }else{
            continue;
        }
    } while(true);

我的问题是

如果我运行它并输入一个输入,例如:'5',它会返回到 do 语句的开头,我必须输入另一个输入。

如果我输入 'q' 退出循环会变得疯狂并不断重复。

【问题讨论】:

  • option 是什么类型?你为什么要把它和false比较?
  • 您可以将它们读取为字符 (char),并将它们与字符 '1'、'2'、'q' 进行比较。注意换行符。

标签: c loops


【解决方案1】:

如果你想退出使用q的程序,你应该将变量option声明为char。


例如:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char option;
    do
    {                     
        printf("Please enter a option, Press 'q' to quit\n"); 
        scanf(" %c",&option);

        if(option == '1')
        {
            //option1(...);
            printf("%c",option);
            break;
        }
        else if(option == '2')
        {
            //option1(...);
            printf("%c",option);
            break;
        }
        else if(option == '3')
        {
            //option1(...);
            printf("%c",option);
            break;
        }
        else if(option == 'q')
        {
            printf("exit\n");
            exit(EXIT_SUCCESS);
        }
        else
        {
            continue;
        }
    } while(1);
    return 0;
}

【讨论】:

    【解决方案2】:

    scanf("%d"... 不会读取“q”。 option 因此可能没有任何值切换,因此执行默认情况,重复循环。这就是你所看到的。 补救措施:

    1. 任何非数字输入都意味着中断:只需将所有内容保持原样,但将 continue 更改为 break 并退出循环。

    2. 捕捉非数字输入并处理它。 scanf 手册页 (http://linux.die.net/man/3/scanf) 说:

      这些函数返回成功匹配的输入项数 并分配

      您可以检查 scanf 返回值,如果为 0,则尝试在另一个语句中扫描该字母;如果是 'q',则中断。

    3. 立即读取一个 char(看起来最干净)并切换 char,而不是它所代表的 int 值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      • 2020-12-05
      • 2017-02-11
      • 1970-01-01
      • 2013-12-24
      • 2016-06-18
      相关资源
      最近更新 更多