假设你有一个未null终止的字符串并且你知道它的确切大小,那么如何printf在C中打印该字符串呢?我记得这样的方法,但现在我找不到...
我刚刚发现 C 编译器有非常奇怪的行为。这是非常简单的代码。我在很多在线C编译器中尝试过,但结果总是一样的,这让我抓狂。
#include <stdio.h>
int main()
{
char Buffer[10] = "0123456789";
char ID[5] = "abcde";
printf("%s",ID);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
花点时间尝试预测函数的结果printf。如果你是像我一样的人,那么我认为最明显的解决方案是“abcde”,这是不正确的!但如果你以某种方式算出了“abcde0123456789”,那么你就在消耗电力来生活。
怎么、怎么可能?我只选择ID要打印的数组,那么为什么Buffer也用它打印呢?这没有道理。即使ID数组也不够大,无法容纳所有数据。我真的要失去理智了。
由于一个C字符阵列需要一个空终止,下面的代码打印4个一个 S和一些乱码.
char y[4] = {'a', 'a', 'a', 'a'};
printf("y = %s\n", y);
Run Code Online (Sandbox Code Playgroud)
输出:
y = aaaa?
Run Code Online (Sandbox Code Playgroud)
但是,以下代码不会生成垃圾字符.
char y[4] = {'a', 'a', 'a', 'a'};
char z[4] = {'b', 'b', 'b'};
printf("y = %s\n", y);
printf("z = %s\n", z);
Run Code Online (Sandbox Code Playgroud)
输出:
y = aaaa
z = bbb
Run Code Online (Sandbox Code Playgroud)
我知道第四个字符z是使用null终止符自动初始化的.我猜也是如此,y并z在内存中彼此相邻分配.
但是,在这种情况下,C如何正确打印4 a而不是前者?它是否确定下一个字节已经分配给另一个变量,所以它应该再停止打印了?