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 &lt; length 在对s1 的迭代中不包括空终止符

    当您部分初始化一个数组时,就像您对char s2[100] = "ECE"; 所做的那样,其余元素已经初始化为零。换句话说,只要length &lt; 99,您对s2 的写入就保证为空终止。

【讨论】:

如果 OP 未初始化 s2 行为将是未定义的。【参考方案2】:

来自 C 标准(6.7.9 初始化)

21 如果大括号括起来的列表中的初始值设定项比那里少 是聚合的元素或成员,或 用于初始化已知大小的数组的字符串文字 是数组中的元素,聚合的其余部分应为 隐式初始化与具有静态存储的对象相同 持续时间。

10 如果具有自动存储时长的对象未初始化 明确地说,它的值是不确定的。如果一个物体有静电 或者线程存储时长没有显式初始化,则:

——如果是指针类型,则初始化为空指针;

——如果它有算术类型,它被初始化为(正数或 无符号)零;

——如果是一个聚合,每个成员都被初始化(递归) 根据这些规则,任何填充都被初始化为零位;

——如果是联合,则初始化第一个命名成员 (递归地)根据这些规则,并初始化任何填充 到零位;

因此在此声明中

char s2[100] = "ECE";

所有没有被字符串字面量元素显式初始化的 96 个元素都被隐式初始化为零。

【讨论】:

请注意,“字符串文字中的或更少的字符...”位不在 ANSI C89 中,因此可能有一些编译器不这样做。

以上是关于C自动将空字符附加到字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串数组附加到共享内存? C

如何将部分字符数组附加到字符串?

c ++附加到字符串

如何将字符附加到字符串? [复制]

将字符串附加到列表中的字符串

R - 如果列包含来自向量的字符串,则将标志附加到另一列