C语言 一次扫描中的多个输入a显示混杂行为

9lowa7mx  于 2023-01-12  发布在  其他
关注(0)|答案(2)|浏览(104)

我尝试了一个使用长数据类型的简单计算。三个数字的加法。但是当我在一个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代码上工作。
我以为是三个数字的总和。

42fyovps

42fyovps1#

%lld说明符应输入long long的地址。您却传入了long的地址。使用错误的格式说明符将触发undefined behavior
最有可能发生的情况是,假设你使用的是VS代码,因此很可能运行在Windows系统上,在该系统上long是4字节,而long long是8字节,所以当scanf试图读取一个值时,它会将8字节写入它给定的指针,而不是4字节,写入超过了变量的结尾,很可能会写入另一个变量。
你正在使用的在线编译器可能使用的是gcc,它有一个8字节的long,所以它碰巧工作。
您应该改为使用%ld说明符,该说明符需要long的地址。

scanf("%ld %ld %ld",&x,&y,&z);
cbwuti44

cbwuti442#

发生这种情况的原因是使用了错误的格式说明符long。请将变量声明为long并使用格式说明符%ld,或者将变量声明为long long并使用格式说明符%lld

相关问题