C自动将空字符附加到字符串?
Posted
技术标签:
【中文标题】C自动将空字符附加到字符串?【英文标题】:C automatically appending null character to a string? 【发布时间】:2022-01-21 16:33:30 【问题描述】:#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[])
int i;
char s1[100] = "Computer Programming Class";
char s2[100] = "ECE";
int length = (int)strlen(s1);
for (i = 0; i < length; i++)
s2[i] = s1[length - 1 - i];
s2[i] = '\n';
printf("%s", s2);
return 0;
这是我的一项测试,我不明白为什么它会按预期工作。这是一段代码,将s1的顺序颠倒过来,存储在s2中,然后打印出来。在我看来,当 s1 向后存储时,s2 中的空字符将被覆盖,而且 s1 中的空字符永远不会被写入 s2,因为它是从最后一个字符开始的。但它打印出来就好了。为什么?
【问题讨论】:
你知道 s2[26] 里有什么吗? 【参考方案1】:strlen
以不包括空终止符的字符形式返回字符串的长度,因此i < length
在对s1
的迭代中不包括空终止符
当您部分初始化一个数组时,就像您对char s2[100] = "ECE";
所做的那样,其余元素已经初始化为零。换句话说,只要length < 99
,您对s2
的写入就保证为空终止。
【讨论】:
如果 OP 未初始化s2
行为将是未定义的。【参考方案2】:
来自 C 标准(6.7.9 初始化)
21 如果大括号括起来的列表中的初始值设定项比那里少 是聚合的元素或成员,或 用于初始化已知大小的数组的字符串文字 是数组中的元素,聚合的其余部分应为 隐式初始化与具有静态存储的对象相同 持续时间。
和
10 如果具有自动存储时长的对象未初始化 明确地说,它的值是不确定的。如果一个物体有静电 或者线程存储时长没有显式初始化,则:
——如果是指针类型,则初始化为空指针;
——如果它有算术类型,它被初始化为(正数或 无符号)零;
——如果是一个聚合,每个成员都被初始化(递归) 根据这些规则,任何填充都被初始化为零位;
——如果是联合,则初始化第一个命名成员 (递归地)根据这些规则,并初始化任何填充 到零位;
因此在此声明中
char s2[100] = "ECE";
所有没有被字符串字面量元素显式初始化的 96 个元素都被隐式初始化为零。
【讨论】:
请注意,“字符串文字中的或更少的字符...”位不在 ANSI C89 中,因此可能有一些编译器不这样做。以上是关于C自动将空字符附加到字符串?的主要内容,如果未能解决你的问题,请参考以下文章