我有问题。当我宣布' x'整数,程序正常工作,但当我删除' x'它给我看了一个奇怪的结果。
#include <stdio.h>
#include <conio.h>
main ()
{
int a,b,x;
char ras;
printf("Insert a: ");
scanf("%d", &a);
printf("Insert b: ");
scanf("%d", &b);
printf("Sum or multuply: (s/m)");
scanf("%s", &ras);
if (ras=='s')
{
printf("Sum is :%d", a+b);
}
else if (ras=='m')
{
printf("Multiply is :%d", a*b);
}
getch();
}
答案 0 :(得分:2)
您的程序以任何方式调用未定义的行为,因为scanf
存储两个字符(输入的字母加上尾随的0字节),但是您指定的指针指向一个只能包含单个字符的变量。 / p>
在您的特定实现中,如果该变量存在,0字节将简单地覆盖x变量。如果没有,你会覆盖别的东西,导致你的奇怪结果。
要阅读单个字符,您应该使用%c
,而不是%s
。
答案 1 :(得分:1)
不要将“%s”放在scanf模式中,它是一个字符串 - 至少两个字符(你想要的加上NULL)。请改用%c。
答案 2 :(得分:0)
那是因为你的代码调用了未定义的行为,显然,它正在做这个“有趣”的事情。
UB的原因是%s
转换说明符使scanf()
在刚刚扫描的字符之外追加一个终止NUL字符,但它没有空间,因此它写入未分配的内存。
请改用%c
。 更好的是,完全摆脱scanf()
,这是邪恶的。请使用健全的功能,例如getchar()
。