【问题标题】:Code fails at case '0' - I don't understand why代码在 case '0' 失败 - 我不明白为什么
【发布时间】:2018-05-06 17:56:58
【问题描述】:

这是强调我遇到的问题的代码的最小形式。 代码在“退出”(案例'0')处失败 - 程序简单地崩溃。我怀疑它与while循环有关。 无论我为退出案例选择什么字符(而不是“0”),都会出现问题。

#include <stdio.h>

void main()
{
    int run=1;
    char menu_option; 

    while (run==1) 
    {
        printf("Choose case:\n");
        scanf ("%s", &menu_option);
        switch (menu_option) {
        case '1':
        printf("1");
        break;

        case '2':
        printf("2");
        break;

        case '0':
        run=0;
        break;

        default:
        printf("Wrong input, try again\n");

        }
    }
}

【问题讨论】:

  • scanf ("%s", &amp;menu_option); 是类型错误或语义错误,但您确实需要发布minimal reproducible example
  • 我认为我在这里遗漏了一些微不足道的东西。我希望程序在用户输入“0”时完成。因此,如果“0”,我将“运行”设置为 0。由于某种原因,选择这种情况时软件会崩溃(即使我将大小写从“0”更改为任何其他字符)
  • 这应该是对我评论的回复吗?
  • 由于您不能将字符串用于 switch case,因此 scanf ("%s", &amp;menu_option); 似乎应该是 scanf (" %c", &amp;menu_option); 并注意添加的空格。由于使用%s 将至少向内存写入2 个字节,当menu_option 可能是char 并且因此只有一个字节时,导致结果行为不值得研究。
  • 失败怎么办?发生什么了?运行时失败?编译失败?错误信息?

标签: c while-loop switch-statement


【解决方案1】:

menu_option 不是字符串,所以%s 是错误的格式说明符。您需要%c,以空格为前缀,以防止空格(包括换行符)被解释为有效的字符输入。

    scanf (" %c", &menu_option);

【讨论】:

  • 谢谢@Clifford 它有效!虽然,我仍然不明白为什么这个问题只发生在“退出”案例而不是其他案例(“1”和“2”)在我看来相似 - 案例之间有什么区别?跨度>
  • 在我的测试中,它对所有三种情况都“有效”,除非我在 GDB 中运行,但在所有三种情况下都失败了 - GDB 在所有三种情况下都检测到了溢出。那就是行为未定义的事情-行为未定义。它所展示的是使用调试器来调试和测试代码的有用性。
  • @EranAmsellem :在您的问题中,您未能描述“崩溃”的性质,但我怀疑在操作系统退出和清理期间发现了故障,而这只发生在 case '0' 中。该错误将损坏堆栈,这可能会影响相邻的局部变量和返回地址 - 在这种情况下,来自 main() 的返回将失败 - 即它在退出时崩溃,而不是在处理 case 块时崩溃。
猜你喜欢
  • 1970-01-01
  • 2016-07-10
  • 1970-01-01
  • 2022-01-24
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-07
  • 2020-01-04
相关资源
最近更新 更多