c - 一个 scanf 中的多个输入显示出各种行为

标签 c scanf

我正在尝试使用长数据类型进行简单计算。三个数字相加。但是,当我在一个 scanf 函数中获取输入时,它会将最初的两个输入视为零。

#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);

现在它工作得很好。 为什么?仅仅通过变量的排列怎么能解决这个问题呢? 我使用 %d 格式说明符以 int 数据类型编写了初始代码,它工作得很好,但与 long 和 %lld 不同。 任何人都可以解释为什么会发生这种情况或者错误是什么。 为什么它在在线编译器上可以工作,但在我的 vs code 上却不行。

我期待三个数字的总和。

最佳答案

%lld 说明符需要 long long 的地址。相反,您传入了 long 的地址。使用错误的格式说明符会触发 undefined behavior .

考虑到您使用的是 VS Code,因此很可能在 Windows 上运行,那么最有可能发生的情况是,在该系统上,long 是 4 个字节,而 long long是8字节。因此,当 scanf 尝试读取一个值时,它会将 8 个字节写入给定的指针,而不是 4 个字节,写入超出变量的末尾,并且很可能写入另一个变量。

您使用的在线编译器可能使用 gcc,它有 8 字节,因此它恰好可以工作。

您应该使用 %ld 格式说明符,它需要 long 的地址。

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

关于c - 一个 scanf 中的多个输入显示出各种行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75045456/

相关文章:

c - fscanf() 在循环中返回相同的模式

c - 使用带有 %i 的 scanf 捕获日期时出现问题 (mm dd yyyy)

c - Eclipse/MinGW 中的 scanf 问题

c++ - 记事本显示 Unicode 字符,因为文件是 ANSI?

c - 使用 atoi 解析 csv 文件

c - 此代码中的第二个 scanf 将不会读取。 (C 代码)

c - 从标准输入读取字符串

c - 对 www.httpbin.org 的错误请求?

c - fscanf/fscanf_s 覆盖数组

用于解析程序中标识符的 Python 包(C、Scala、Lisp)?