为啥这个 switch 语句在运行时会结束 while 循环?

Posted

技术标签:

【中文标题】为啥这个 switch 语句在运行时会结束 while 循环?【英文标题】:Why does this switch statement end the while loop when it's run?为什么这个 switch 语句在运行时会结束 while 循环? 【发布时间】:2021-02-26 02:50:53 【问题描述】:

我希望这个程序从 switch 中中断并返回到 while 循环。为什么它不起作用?

我在 while 循环中放置了一个 switch 语句。我认为中断会干扰 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;

【问题讨论】:

%1s 将读取一个字符并附加一个空字符,您没有空间。 (那个空字符可能会覆盖你的布尔值,它会变成假的。) %1s 更改为%c while (ON_status == true) 最好写成while (ON_status) @john-kugelman 我不相信这是一个骗局。首先,它是 dup 的反转/反转......而且根本原因是缓冲区溢出。投票支持重新开放。 @PaulOgilvie 是的,你是对的。我检查了optionON_status的内存地址。两者都分配在相邻的内存地址中。 Null char 确实覆盖了 ON_status 变量 【参考方案1】:

您的代码的问题在于该行

scanf("%1s", &option);

溢出option中的内存。

C 中的字符串以空值结尾。因此 '%1s' 存储一个字符和一个空终止符。但是您的 option 变量只有一个字符长,那么零(或 NULL、NUL、null 取决于您的命名)到哪里去了?

在这种情况下,因为ON_status 和选项在内存中被声明为附近,所以它会覆盖ON_status

要查看正在发生的事情,您可以在 switch 之外打印 ON_status 的值,您会发现它是 0。

为了解决这个问题,我想我会将您的scanf 替换为

option = getc(stdin);

【讨论】:

以上是关于为啥这个 switch 语句在运行时会结束 while 循环?的主要内容,如果未能解决你的问题,请参考以下文章

这个PHP流程判断switch语句哪里出错了?为啥不执行default后面的语句

switch结构case语句后的多个语句必须放在花括号中。 这句话对吗?为啥?

为啥“defau4t”在 switch 语句中是合法的? [复制]

为啥我的两个 cin 语句没有在程序结束时运行?

switch 究竟应该怎么缩进

Java中为啥我写switch语句,在case后加break就错误,不加就正确,很困惑,