Switch Case工作方式不同

时间:2013-07-16 19:39:09

标签: c char switch-statement

考虑两个代码。为什么他们给出了不同的输出,虽然相同的值被分配给i,'i'在两个代码中都是char。

第一个代码 - > (此处值直接分配给i)

void main()
 {
  char i=3;

  clrscr();
  switch(i)
     {
      default : printf("\nHi..\n");
          break;
      case 1:printf("\na");
         break;
      case 2:printf("\nb\n");
        break;
      case 3:printf("\nc");
          break;
      }
  }

秒使用printf-scanf --->

void main()
 {
  char i;
  printf("ENTER i");
  scanf("%c",&i);
  clrscr();
  switch(i)
     {
      default : printf("\nHi..\n");
                break;
      case 1:printf("\n\na");
         break;
      case 2:printf("\nb\n");
        break;
      case 3:printf("\nc");
          break;
      }
 }

在第二个代码中,当我输入3作为输入时,我得到“Hi ..”作为输出。是什么让这两个代码的工作方式不同.. ??

4 个答案:

答案 0 :(得分:1)

从stdin读取字符后:

scanf("%c",&i);

i将包含3(51)的ASCII码而不是值3,从而导致default的{​​{1}}分支。

解决方案是将您的变量声明为switch并使用

int

阅读它。

在第一个示例中,您为scanf("%d",&i); 分配了整数值i,这与分配字符3不同。在C中,当您为'3'变量赋值时,该值将表示特定于某个字符的代码(考虑标准)。

在第二个示例中,char函数从scanf读取一个字符,由于使用stdin而被解释为字符,并将给定的变量分配给特定的代码阅读角色。

答案 1 :(得分:1)

在您使用的第一个

char i = 3

但是当你使用scanf时,你基本上使用:

char i = '3'

这两个包含不同的值

请参阅以下ASCII http://www.asciitable.com/

答案 2 :(得分:0)

它与switch语句无关,而与scanf函数无关。

阅读其文档,即scanf(3)手册页。另请参阅this answer一个非常相关的问题。

请注意,字符'3'未编码为3,而是ASCII中的51

学习启用所有警告和调试信息(例如使用gcc -Wall -g进行编译)并学习使用调试器(即gdb

答案 3 :(得分:0)

将您的代码更改为

char i  -> int i;

scanf("%c",&i) -> scanf(" %d",&i);