为什么运行这个switch语句会结束while循环?

4

我希望这个程序能够从 switch 语句中跳出,并回到 while 循环中。为什么它没有生效呢?

我在 while 循环中放置了一个 switch 语句。我认为这些 break 语句干扰了 while 循环,导致其提前退出。我该如何解决这个问题?

#include <stdbool.h>
#include <stdio.h>


 int main(void)
 {
 
 bool ON_status = true;
 char option = '0';

  while (ON_status == true)
  {
      printf("enter option 1, 2, 3, or 4.\n");
      printf("Select an option from the menu above then press the enter key:  ");
      scanf("%1s", &option);

      switch (option)
      {
      case '1':
           printf("option1 was selcted");
           break;

      case '2':
           printf("option2 was selcted");
           break;

      case '3':
           printf("option3 was selcted");
           break;

      case '4':
           printf("option4 was selcted");
           ON_status = false;
           break;

      default:
           break;
      }
  }
 return 0;
}

3
%1s会读取一个字符并添加一个空字符,而你没有足够的空间。这个空字符可能会覆盖你的布尔值,并使其变为false。 - Paul Ogilvie
1
将“%1s”更改为“%c”。 - Krishna Kanth Yenumula
while (ON_status == true) 最好改为 while (ON_status) - Keith Thompson
@john-kugelman 我不认为这是一个重复的问题。首先它是dup的反向/相反...而且根本原因是缓冲区溢出。投票重新开放。 - idz
@PaulOgilvie 是的,你是正确的。我检查了optionON_status的内存地址。它们都被分配在相邻的内存地址中。空字符确实覆盖了ON_status变量。 - Krishna Kanth Yenumula
1个回答

2
您的代码存在问题,出现错误的行是:
scanf("%1s", &option);

option中溢出了内存。

C语言中的字符串是以空字符结尾的。因此,'%1s'只存储一个字符和一个空字符结束符。但是你的option变量只有一个字符长度,那么零(或NULL、NUL、null根据你的命名而定)放在哪里呢?

在这种情况下,由于ON_statusoption在内存中声明得很接近,它正在覆盖ON_status

为了看到正在发生的事情,您可以在switch外部打印ON_status的值,您会发现它为0。

要解决这个问题,我认为应该用以下代码替换你的scanf

option = getc(stdin);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接