嵌套开关:为啥第二个开关命令不接受输入?

Posted

技术标签:

【中文标题】嵌套开关:为啥第二个开关命令不接受输入?【英文标题】:nested switch : why does the second switch command not accept an input?嵌套开关:为什么第二个开关命令不接受输入? 【发布时间】:2015-11-02 12:51:31 【问题描述】:

我是 c 编程新手,在完成 c 语言课程的作业时,我遇到了一个问题......

int main() 
char one, ona, onb;

/*code for choices (a), (b), and (c) here*/
scanf ("%c", &one);

switch (one) 
    case 'a':
        /*code for choices (d), and (e) here*/
        scanf ("%c", &ona);

        switch (ona) 
            case 'd':
                printf ("end");
                break;
            case 'e':
                printf ("continue");
                break;
        
        break;

    case 'b':
        /*code for case 'b' here*/
        break;

    case 'c':
        /*code for case 'c' here*/
        break;


system ("pause > nul");
getch ();
return 0;

当我编译和运行我的控制台应用程序时,我的嵌套开关命令(在 ona 和 onb 下的那些)不起作用?

我已经检查了所有的休息时间;命令,他们都在那里?我有什么遗漏/做错了吗?

我曾尝试阅读有关嵌套开关的其他类似问题,但是,我还没有找到解决我的问题的问题...

如果这有助于找到答案,我在多个 printf 语句之后使用 system ("pasue > nul")? (另外,我正在使用 dev-c++,因为它是我们教授告诉我们使用的推荐应用程序)

我希望有人能够找到我编码错误的内容;;非常感谢你! :)

【问题讨论】:

“不工作”是什么意思? 问题不是你的代码而是你的输入。用“ad”(例如)测试它会起作用。 好吧,当我运行程序并到达 switch(ona) 应该工作的部分时,它没有,它直接进入代码的最后一部分 > printf ("\n\n"); (...) 返回 0; :( “我的代码不起作用”不是特定的问题陈述。拿tour学习How to Ask。 啊,我很抱歉!然后我会编辑标题,谢谢你让我知道! @Olaf :) 【参考方案1】:

您可能正在输入类似“a d”的内容,导致您的第二个scanf 读取回车键。如果您编写代码来读取字符,则必须输入字符。如果要输入行,请编写代码来读取行。

【讨论】:

你好!很抱歉给您带来了困扰,但是我怎样才能避免在输入“a”后必须,因为我编码的开关在我输入“a”后不会自动执行?非常感谢你!! :) @fujisaki 写出你真正想要的代码。如果您想读取 lines,则编写读取行的代码。或者也许您应该编写一个读取字符但忽略换行符的函数。编写你想要的代码。 我在scanf ("%c", &ona);switch(ona) 终于运行之前添加了另一个scanf!不过可能有更好的方法来解决我的问题,哈哈,非常感谢你的回答!!非常感谢!!【参考方案2】:

scanf%c 格式说明符将匹配任何字符,包括换行符。在第一个scanf 之后,您输入的字符将放在one 中,并在输入缓冲区中留下一个换行符。下一个 scanf 拾取留在缓冲区中的换行符,因此不会提示您输入任何内容。

这就是为什么添加一个额外的scanf 似乎可以解决您的问题。

当使用%c 时,您应该在模式中在其前面放置一个空格。该空格将匹配并丢弃任何换行符。

所以改变这些:

scanf ("%c", &one);
...
scanf ("%c", &ona);
...
scanf ("%c", &onb);

致这些:

scanf (" %c", &one);
...
scanf (" %c", &ona);
...
scanf (" %c", &onb);

检查scanf 的返回值也很重要,以确保匹配预期的模式数量,并在不匹配时进行错误处理。

【讨论】:

以上是关于嵌套开关:为啥第二个开关命令不接受输入?的主要内容,如果未能解决你的问题,请参考以下文章

我怎么做svn开关结帐的第二个副本

不常见的自制程序错误:“未知命令:开关”

Linux 下通过命令行和脚本开关笔记本触控板和其他输入外设

为啥当我选择第二个输入框时音译不起作用?

数据结构与算法之深入解析“灯泡开关”的求解思路与算法示例

为啥开关(Java)会发生这种情况? [复制]