c - 为什么 scanf(%s) 中的 char 参数即使乱序也无法在 %c 中显示?

标签 c scanf undefined-behavior c-strings stdio

char num1, num2;
scanf("%s %s", &num1, &num2);
printf("num1=%c, num2=%c", num1, num2);

我在 Mac 上的 Visual Studio 上执行了上述代码,情况如下:

Input: a b   => num1=, num2=b
Input: ab c  => num1=, num2=c
Input: a bc  => num1=c, num2=b
Input: ab cd => num1=d, num2=c

我绝对知道 %s 应该是 %c,但我想知道为什么第一个参数 char num1 无法在 %s 中正确显示。

此外,如果我们输入“a bc”或“ab cd”,num2 的值会先于 num1。这看起来很困惑。

C 中导致这些奇怪输出的原因或机制是什么?和你电脑上的结果一样吗?我认为了解原因比约定俗成更重要。

最佳答案

程序有未定义的行为。

格式说明符%s将零字符附加到相应参数占用的内存中。

尽管如此,我可以解释程序的输出。

看起来在堆栈中变量num1位于变量num2之后。

所以当输入是

nput: a b

然后在变量num2的地址写入两个字符'b''\0';字符'\0'占用变量num1的内存。

所以输出是

num1=, num2=b

当输入为

Input: ab c

再次将终止零写入变量num1占用的内存中。

所以你会得到与上面相同的输出

num1=, num2=c

当输入为

Input: a bc

然后在&num2寻址的内存中写入了三个字符:'b''c''\0 '。因此字符'b'被放置在变量num2中,字符'c'被放置在变量num1中code> 和终止零覆盖超出为变量分配的内存的内存。

所以输出是

num1=c, num2=b

在最后一种情况下,当输入为

nput: ab cd

那么输出将是

num1=d, num2=c

如上所述。

关于c - 为什么 scanf(%s) 中的 char 参数即使乱序也无法在 %c 中显示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57325057/

相关文章:

c - 如何在 MacOSX 上编译 Subsurface 的静态二进制文件?

c - printf 打印出错误的值

c - 为什么 MATLAB 使用列优先顺序?

c - 我将如何创建一个每次迭代读取一个字符并存储该字符的 while 循环?

c - 预计算指数 (exp) 表

c - 扫描多行直到到达特定字符

c - fscanf 只读取第一个字段 C

c++ - 交换包含不可平凡复制类型的 `std::aligned_storage` 实例 - 未定义的行为?

c++ - 有人可以向我解释这是未定义的行为吗?

c - 打印字符时会发生哪些积分提升?