我开始学习C并且在数组方面有点困惑。
#include <stdio.h>
int main()
{
int i;
char j[5];
for (i = 0; i < 5; i++)
{
j[i] = 'a';
}
printf("%s\n", j);
}
运行此代码打印出来
aaaaa♣
我已经读过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);
}
我得到的输出是:
aaaaa
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]);
}
}
但是,在输出中,我看不到nullbyte。这是因为它只会在作为字符串输出时添加吗?
97
97
97
97
答案 0 :(得分:5)
添加空字节是你的工作。编译器不一定会为您执行此操作。局部变量通常在运行时保持未初始化状态。
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 */
请注意,如果您使用字符串初始值设定项而不是手动设置每个字符,那么编译器将处理为您添加空终止符:
char j[5] = "aaaa"; /* initialize to {'a', 'a', 'a', 'a', '\0'} */
答案 1 :(得分:1)
在这两种情况下,您都使用期望0终止的函数打印char 数组而不使用0终止。
在每个字符串上添加一个'\ 0'(不包括带有5个字符的字符串)
for (i = 0; i < 4; i++)
{
j[i] = 'a';
}
j[4] = '\0';
此外,您的阵列长度为5个字符/字节,而不是6.您可以在其中存储4个字符+ 0终结点,而不是5个字符+ 0终结点。
对于%d
循环,您将每个'a'打印为整数。传递给printf的“%d \ n”字符串自动以0结尾,因此输出为97\n
答案 2 :(得分:1)
The char array is one byte longer than I'm using. I suspect this is why I don't see that odd character at the end of the string?
不是真的,如果你只添加了4个元素,那么第5个就是巧合。对于第5个字符,您应该完成此j[4] = '\0';
,在这种情况下,下一个内存地址可能有\0
值。
But, in the output, I see no nullbyte
那是因为你只打印前4个字符(见你的循环)。
答案 3 :(得分:0)
你在构造像这样的字符串时需要将空字符放在自己身上。
唯一一次不设置字符串文字......
char *str = "this is a string";
编译器会在最后弹出\0
。
答案 4 :(得分:0)
没有空字节,因为您只打印了前四个字节。 null是第五个。此外,除非使用编译器生成的字符串(例如“string”),否则需要手动设置空字节。你的代码现在工作的唯一原因是字符串所在的内存恰好是0。至于要求空字节,c字符串用它来表示字符串的结尾。它并不总是用于数组,但只要数组被解释为字符串就需要存在。