【问题标题】:While,switch, case statementwhile、switch、case 语句
【发布时间】:2013-05-10 03:37:23
【问题描述】:

我正在为我的菜单使用whileswitchcase 语句,当它运行时它一直说输入选择,我知道while(1) 创建了一个无限循环,但有没有办法避免这种情况?

while(1)
{
    printf("\nEnter Choice \n");
      scanf("%d",&i);
      switch(i)
      {
            case 1:
            {
             printf("Enter value to add to beginning: ");
             scanf("%c",&value);
             begin(value);
             display();
             break;
             }
             case 2:
             {
             printf("Enter value to add last: ");
             scanf("%c",&value);
             end(value);
             display();
             break;
             }
             case 3:
             {
             printf("Value to enter before\n");
             scanf("%c",&loc);

             printf("Enter value to add before\n");
             scanf("%c",&value);

             before(value,loc);
             display();
             break;
             }
             case 4 :
             {
             display();
             break;
             }

      }
}

任何帮助将不胜感激。

【问题讨论】:

  • 您希望 while 循环何时退出?
  • 您可以在需要时break; 退出循环。
  • 不清楚你想要发生什么。如果你只想看一次,为什么要使用循环?

标签: c while-loop switch-statement


【解决方案1】:

虽然(1)没问题。但是你必须有一些条件才能完成循环。喜欢:

while(1){
.........
if(i == 0)
  break;
............
}

在每个“%d”和“%c”的开头添加一个空格,因为scanf总是在缓冲区中留下一个换行符:

"%d"->" %d" 
"%c"->" %c"

【讨论】:

  • 我有这些条件,对于案例 1-5,但我尝试使用循环的原因是因为它是用于双向链表,需要不断添加到列表中。跨度>
  • 查看以上菜单的完整代码。我想说的是我知道 while(1) 会创建一个无限循环,这不是问题,我可以在 while(i!=4) 处停止它,但它一直说 Enter Choice。例如,如果我运行它并按 1,我会得到 Enter 选择,然后在开始时按 Enter,但它不允许我在那里输入任何内容,但是如果我按 1 并在下一个循环中添加“a”,它有效。
  • 对不起,仍然试图了解你真正的问题是什么。但可能因为'i'的数据类型是整数,在你输入1之后,你必须输入一个'enter'或非-numeric char 让它知道你已经输入了一个整数。但是对于'value'就不一样了,它的数据类型是char,不管你输入什么,只要你输入一个char或者数字,它就会立即接受,你不需要等待。
  • 正如他们所说的一张图片告诉一千个单词,如果你看这张图片,它会得到最好的解释。 s7.postimg.org/pwuxcixkr/null.png 。即使我输入选项,它仍然要求输入选项,但是一旦我选择一个并放置一个字符,它就会将它添加到链接列表中,我想要得到的是它不让我在 value 之后添加它添加到开头,所以它不会让我选择一个选项然后在两个不同的步骤中输入值
  • 这个问题是c的问题,不是你的问题。解决方案是更改所有“%d”->“%d”和“%c”->“%c”。在每个“%d”和“%c”的开头添加一个空格
【解决方案2】:

替代解决方案,

int i = !SOME_VALUE;

while(i != SOME_VALUE)
{
   printf("\n\nEnter Choice ");
   scanf("%d",&i);

    switch(i)
    {
        case SOME_VALUE: break;
         .
         .
         .
       // the rest of the switch cases
    }
}

SOME_VALUE 是通知停止循环的任意整数。

【讨论】:

  • 请记住,switch 中的 break 会终止 switch 而不是封闭的 loop
  • @JonathanLeffler.. 切换中断后再次检查 while 循环条件,这将变为错误,因为 i == SOME_VALUE
  • 好吧——我没注意到你把循环从while (1)改了,这是我的粗心。
【解决方案3】:

或者,您可能希望在与输入相关的循环中放置一个条件,例如

do
{
    printf("\n\nEnter Choice ");
    scanf("%d",&i);
    // the rest of the switch is after this
} while (i != SOME_VALUE);

注意 do 循环的使用,它在将一个值读入 i 之后测试最后的条件。

【讨论】:

    【解决方案4】:

    我可能会写一个可以在循环中调用的函数:

    while ((i = prompt_for("Enter choice")) != EOF)
    {
         switch (i)
         {
         case ...
         }
    }
    

    prompt_for() 函数可能是:

    int prompt_for(const char *prompt)
    {
        int choice;
        printf("%s: ", prompt);
        if (scanf("%d", &choice) != 1)
            return EOF;
        // Other validation?  Non-negative?  Is zero allowed?  Retries?
        return choice;
    }
    

    您还可以在以下位置找到相关讨论:

    【讨论】: