考虑两个代码。为什么他们给出了不同的输出,虽然相同的值被分配给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 ..”作为输出。是什么让这两个代码的工作方式不同.. ??
答案 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);