有两个用Dev-c ++编写的代码,第一个是正常工作而另一个不是,为什么?
/* this code is working properly*/
#include<stdio.h>
int main()
{
char op; // this is the point
int a,b,c; // where another code differs
printf("Enter the two no.s:");
scanf("%d %d",&a,&b);
printf("Enter the operation(+/-/*//):");
scanf("%s",&op);
switch(op)
{
case '+': c=a+b;
printf("%d",c);
break;
case '-': c=a-b;
printf("%d",c);
break;
case '*': c=a*b;
printf("%d",c);
break;
case '/': c=a/b;
printf("%d",c);
break;
default: printf("Invalid Operation");
}
}
/* this code is not working properly; only altered the declaration sequence of int and char*/
#include<stdio.h>
int main()
{
int a,b,c;
char op;
printf("Enter the a:");
scanf("%d %d",&a,&b);
printf("Enter the operation(+/-/*//):");
scanf("%s",&op);
switch(op)
{
case '+' : c=a+b;
printf("%d",c);
break;
case '-' : c=a-b;
printf("%d",c);
break;
case '*' : c=a*b;
printf("%d",c);
break;
case '/' : c=a/b;
printf("%d",c);
break;
default: printf("Invalid Operation");
}
}
答案 0 :(得分:4)
这是你的问题:
scanf("%s",&op);
%s
格式说明符需要一个指向的指针,该指针可以存储字符串的数组的第一个字符。您传入的内容是单个字符的地址。
因此,当您输入+
之类的符号时,会将其写入op
,但会在op
之后的任何内存中写入空字节。完成字符串。通过写入你不应该写的内存,这会调用undefined behavior。
对于未定义的行为,任何事情都可能发生。您的程序可能会崩溃,它可能会显示意外的结果,或者它似乎可能正常工作。此外,进行看似无关的更改,例如添加printf
进行调试或(如您的情况)更改变量的顺序可能会改变未定义行为的显示方式。
要读取单个字符,您需要使用%c
格式说明符。您还需要在格式字符串之前添加空格才能使用空格,即前一个scanf
调用的换行符。这是必需的,因为%c
本身不会跳过空格,这与其他格式说明符不同,例如%d
或%s
。
scanf(" %c",&op);