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

时间:2015-11-02 12:51:32

标签: c nested switch-statement dev-c++

我是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 ++,因为它是我们教授告诉我们使用的推荐应用程序)

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

%c的{​​{1}}格式说明符将匹配任何字符,包括换行符。在第一个scanf之后,您输入的字符将放在scanf中,并且输入缓冲区中会留下换行符。下一个one选择保留在缓冲区中的换行符,结果不会提示您输入任何内容。

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

使用scanf时,您应该在模式中放置一个空格。该空间将匹配并丢弃任何换行符。

所以改变这些:

%c

对于这些:

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

检查scanf (" %c", &one); ... scanf (" %c", &ona); ... scanf (" %c", &onb); 的返回值以确保预期的模式数量匹配也很重要,并且在不是这种情况时进行错误处理。