【问题标题】:C automatically appending null character to a string?C自动将空字符附加到字符串?
【发布时间】: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] 里有什么吗?

标签: arrays c initialization string-literals zero-initialization


【解决方案1】:
  1. strlen 以不包括空终止符的字符形式返回字符串的长度,因此i &lt; length 在对s1 的迭代中不包括空终止符

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

【讨论】:

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

来自 C 标准(6.7.9 初始化)

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

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

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

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

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

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

因此在此声明中

char s2[100] = "ECE";

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

【讨论】:

  • 请注意,“字符串文字中的或更少的字符...”位不在 ANSI C89 中,因此可能有一些编译器不这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-27
  • 2023-01-19
  • 2012-11-09
  • 1970-01-01
  • 2012-05-28
  • 2012-10-04
相关资源
最近更新 更多