带switch语句的C程序设计问题

带switch语句的C程序设计问题,c,C,我对switch语句有问题。 我尝试了许多不同的方法来处理它,我也在谷歌上搜索了一下,但我找不到一个解决方案,可能是一个基本的错误 错误: switch(dnevi) -> switch quantity not an integer case "Pet" -> case label does not reduce to an integer constant case "Sob" -> case label does not reduce to an integer cons

我对switch语句有问题。 我尝试了许多不同的方法来处理它,我也在谷歌上搜索了一下,但我找不到一个解决方案,可能是一个基本的错误

错误:

switch(dnevi) -> switch quantity not an integer
case "Pet" -> case label does not reduce to an integer constant
case "Sob" -> case label does not reduce to an integer constant
代码:


似乎除了单字符匹配之外,还需要与字符串匹配。因此,您正在尝试读取字符串作为输入。简单的错误处理如图所示,您可能需要更高级的东西

if (scanf("%4s", dnevi) != 1) {
    strcpy(dnevi, "?"); /* simple error handling */
}
scanf("%*[^\n]");       /* get the rest of the input */
但是,正如错误所述,您需要为
开关提供一个整数。您可以在第一个角色上执行此操作

switch(dnevi[0])
但是,您现在必须处理这样一个事实:您有两个
p
选择和两个
S
选择。在那些特殊情况下,用特殊情况处理。字符串文本被
包围


不能将字符串用作
大小写
标签。此外,字符串通常是在
中编写的。”“
而不是
。但你也有其他问题。您将
dnevi
读取为整数,但将其存储在
char
数组中并与字符进行比较。“Pet”和“Sob”的可能重复项应类似于“p”和“s”。您必须扫描(“%c”,ch)字符。c字符串文字总是使用
,而不是
''
中包含的字符序列是字符常量,类型为
int
,而不是字符串。这就是为什么您可以使用字符常量作为大小写标签,但产生的行为不太可能是OP想要的。您可能还想添加一些错误检查来检查字符串的其余内容。@CoffeeTableEspresso:
strcmp
是完全匹配的,而不是前缀匹配。不过我添加了其他错误检查,谢谢。
switch(dnevi[0])
case 'P': 
    if (dnevi[1] == '\0')
        printf("To je ponedeljek");
    else if (strcmp(dnevi, "Pet") == 0)
        printf("To je petek");
    else
        printf("Vnos je bil napacen!");
    break;
...
case 'S': 
    if (dnevi[1] == '\0')
        printf("To je sreda");
    else if (strcmp(dnevi, "Sob") == 0)
        printf("To je sobota");
    else
        printf("Vnos je bil napacen!");
    break;
...
default: 
    printf("Vnos je bil napacen!");