【问题标题】:Why this switch case goes to the default case?为什么这个 switch case 会变成 default case?
【发布时间】:2020-03-27 16:43:07
【问题描述】:

代码应该检查元音输入。如果找到,它会打印“元音”,如果没有,它应该打印“辅音”。但是无论输入如何,编译器都会转到default 的情况,我找不到错误在哪里。请帮忙。

这是我的代码:

#include<stdio.h>

void main()
{
    char ch;
    printf("Insert a Char \n");
    scanf("%d", &ch);

    switch(ch)
    {
    case 'a':
    case 'e':
    case 'i':
    case 'o':
    case 'u':
        printf("Vowel");
        break;

    default:
        printf("Consonent");
    }
}

【问题讨论】:

标签: c switch-statement


【解决方案1】:

此调用中的转换说明符%d

scanf("%d", &ch);

无效。它试图读取一个数字。所以输入像“A”这样的字母会导致输入错误。

编译器可以发出警告甚至错误报告,例如

格式“%d”需要“int *”类型的参数,但参数 2 具有类型 ‘字符*’

因为使用无效的格式会导致未定义的行为。

这是一个演示程序

#include <stdio.h>

int main(void) 
{
    char s[] = "ABCD";

    puts( s );

    scanf( "%d", ( int * )s );

    puts( s );

    return 0;
}

例如,如果输入一个有效的 ASCII 码,例如字母 65'A',那么程序输出可能看起来像

ABCD
A

即数组占用的内存被覆盖了。

改为使用以下调用。(如果您想跳过空格)

scanf( " %c", &ch );

或以下调用

scanf( "%c", &ch );

注意,根据C标准,没有参数的函数main应该声明为

int main( void )

【讨论】:

  • 如果输入一个介于 97 和 122 之间的数字会怎样?
  • @usr2564301 将出现未定义的行为,因为对 char 类型的对象使用了无效的转换说明符。
  • @usr2564301 不,它将在 OPs 代码中工作。 97=='a' 是一个真实的陈述。在 vlad 的代码中使用 97 将重现原始问题,即ch 的值为 0
  • @LewisKelsey 会有未定义的行为,因为不属于char类型的对象的内存可以被覆盖。
  • @VladFromMoscow 是否将其符号扩展为 97 到 4 个字节,然后将其写入 ch?
【解决方案2】:

第一件事 %d 接受一个整数,而不是一个字符,所以纠正这个并运行然后 在每个案例结束后放置 break 如果你不放置 break 它将运行所有情况直到最后,这是默认设置。 示例:-

char ch;
printf("Insert a Char \n");
scanf("%c", &ch);

switch(ch)
{
case 'a':printf("Vowel");
    break;

case 'e':printf("Vowel");
    break;

case 'i':printf("Vowel");
    break;

case 'o':printf("Vowel");
    break;

case 'u':
    printf("Vowel");
    break;

default:
    printf("Consonent");
}

希望它会有所帮助。 快乐编码:-)

【讨论】:

    【解决方案3】:

    您应该使用“%c”作为格式。当您使用“%d”时,该值为 0(因为在输入字符串中未检测到整数)。参考https://en.cppreference.com/w/c/io/fscanf#Example

    这个问题,以及void main() 而不是int main(),应该会产生编译器警告。

    【讨论】:

      【解决方案4】:

      谢谢大家。感谢您的帮助! 不过我应该注意到数据类型。

      包括

      空主() {

      char ch;
      printf("Insert a Char \n");
      scanf("%c", &ch);
      
      switch(ch)
      {
      case 'a':
      case 'A':
      
      case 'e':
      case 'E':
      
      case 'i':
      case 'I':
      
      case 'o':
      case 'O':
      
      case 'u':
      case 'U':
          printf("Vowel");
          break;
      
      default:
          printf("Consonant");
      }
      

      }

      【讨论】:

        猜你喜欢
        • 2021-12-08
        • 2013-07-14
        • 2014-11-09
        • 2018-03-23
        • 2017-07-07
        • 1970-01-01
        • 2013-05-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多