我尝试了一个使用长数据类型的简单计算。三个数字的加法。但是当我在一个scanf函数中取输入时,它把intial two输入当作零。
#include <stdio.h>
int main()
{
long x,y,z;
printf("Input x,y,x:\n");
scanf("%lld %lld %lld",&x,&y,&z);
printf("Result: %lld\n",x+y+z);
return 0;
}
这段代码在在线编译器中运行得非常好,但在我的vscode中却不行。我检查了我们使用的相同的C版本。我对代码做了一点修改,即,
scanf("%lld %lld %lld",&z,&y,&x);
现在它工作得很好。为什么?仅仅是变量的排列怎么能解决这个问题呢?我用int数据类型和%d格式说明符做了初始代码,它工作得很好,但是用long和%lld就不一样了。谁能解释一下为什么会发生这种情况或者是什么错误吗?为什么它能在在线编译器上工作,而不能在我的vs代码上工作。
我以为是三个数字的总和。
2条答案
按热度按时间42fyovps1#
%lld
说明符应输入long long
的地址。您却传入了long
的地址。使用错误的格式说明符将触发undefined behavior。最有可能发生的情况是,假设你使用的是VS代码,因此很可能运行在Windows系统上,在该系统上
long
是4字节,而long long
是8字节,所以当scanf
试图读取一个值时,它会将8字节写入它给定的指针,而不是4字节,写入超过了变量的结尾,很可能会写入另一个变量。你正在使用的在线编译器可能使用的是gcc,它有一个8字节的
long
,所以它碰巧工作。您应该改为使用
%ld
说明符,该说明符需要long
的地址。cbwuti442#
发生这种情况的原因是使用了错误的格式说明符
long
。请将变量声明为long
并使用格式说明符%ld
,或者将变量声明为long long
并使用格式说明符%lld