我开始学习C并且在数组方面有点困惑.
#include <stdio.h>
int main()
{
int i;
char j[5];
for (i = 0; i < 5; i++)
{
j[i] = 'a';
}
printf("%s\n", j);
}
Run Code Online (Sandbox Code Playgroud)
打印出来运行此代码
aaaaa?
Run Code Online (Sandbox Code Playgroud)
我已经读过char数组需要比字符串长一个字节,所以编译器可以放在\0最后.如果我用这个替换代码:
#include <stdio.h>
int main()
{
int i;
char j[5];
for (i = 0; i < 4; i++)
{
j[i] = 'a';
}
printf("%s\n", j);
}
Run Code Online (Sandbox Code Playgroud)
我得到的输出是:
aaaaa
Run Code Online (Sandbox Code Playgroud)
char数组比我使用的长一个字节.我怀疑这就是为什么我没有在字符串的末尾看到那个奇怪的字符?
我尝试用以下代码测试这个理论:
#include <stdio.h>
int main()
{
int i;
char j[5];
for (i = 0; i < 4; i++)
{
j[i] = 'a';
}
for (i = 0; i < 4; i++)
{
printf("%d\n", j[i]);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,在输出中,我看不到nullbyte.这是因为它只会在作为字符串输出时添加吗?
97
97
97
97
Run Code Online (Sandbox Code Playgroud)
添加空字节是你的工作.编译器不一定会为您执行此操作.局部变量通常在运行时保持未初始化.
int i;
char j[5]; /* five uninitialized characters, could be anything */
for (i = 0; i < 4; i++)
{
j[i] = 'a';
}
j[4] = '\0'; /* explicitly add null terminator */
Run Code Online (Sandbox Code Playgroud)
请注意,如果您使用字符串初始值设定项而不是手动设置每个字符,则编译器将处理为您添加空终止符:
char j[5] = "aaaa"; /* initialize to {'a', 'a', 'a', 'a', '\0'} */
Run Code Online (Sandbox Code Playgroud)