C - 不评估交换机中的多个Scanf语句

时间:2017-04-27 00:27:10

标签: c switch-statement scanf

我遇到一些非常基本的C代码问题,我无法在任何现有的StackOverflow问题上找到解决方案。

问题很简单:我在scanf语句的两个cases内有两个switch语句。第一个语句每次都完美执行。然而,第二种情况并不起作用,无论switch正在评估哪种情况。

这是我编写的一个小程序来演示这个问题:

#include<stdio.h>
#include<string.h>

int main(void)
{
int i = 0;

char *str1;
char *str2;
int state1, state2;
switch(i)
{
    case 0:
        state1 = scanf("%s", str1);
        getchar();
        break;
    case 1:
        state2 = scanf("%s", str2);
        getchar();
        break;
    default:
        printf("Something weird happened.\n");
        break;
    }
    printf("String 1: %s\nString 2: %s\nReturn 1: %d\nReturn 2: %d\n", str1, 
    str2, state1, state2); 

    return 0;
}

getchar用于确保它不会出现输入溢出问题。

如果我使用输入i = 0的{​​{1}}运行,那么我

"hello"

如果使用String 1: hello String 2: (null) Return 1: 1 Return 2: 4195648 i = 1运行,则输出

"hello"

正如您所看到的,尽管遍历String 1: String 2: (null) Return 1: 0 Return 2: 0 ,但字符串2从未被赋予值。

对我而言,这意味着case语句以某种方式贯穿每个switch直到匹配的语句而不实际评估其中的内容,因为case和{{} {1}}在第二个实例中为0。

有谁知道为什么会发生这种情况以及如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

变量i仅设置为0,因此仅评估开关/案例0:。

永远不会重新输入switch语句,并且永远不会更新i的值,因此不会评估/执行任何其他开关/案例。

我怀疑你对switch语句如何工作的想法并不完全正确。