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/