gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:05:00 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com