【问题标题】:whats the difference between inclusion of null character and exclusion in character array?字符数组中包含空字符和排除字符有什么区别?
【发布时间】:2016-10-09 18:26:02
【问题描述】:

以下两个字符数组有什么区别:一个带空字符,一个不带空字符?

char name1[] = {'j','o','h','n'};
char name2[] = {'j','o','h','n','\0'};

如果name1name2 之间存在差异,strlen 如何处理name1,因为它没有空字符?

结果是什么

printf("%d", name1[5] == '\0'); 

我预计它是 0,但得到了 1

【问题讨论】:

  • 在这两种情况下,您都定义了一个 char 数组。如果您希望编译器添加nul 终止符,则需要使用字符串文字定义值,例如char name1[] = "john";
  • 嗯,关于strlen 的一些讲座可能会表明strlen 确实适用于非空终止的字符串。

标签: c string character


【解决方案1】:

strlen 如何在 name1 上工作,因为它没有空字符。

它没有。这将调用未定义的行为。

我预计它是 0,但得到了 1

您的代码 sn-p 尝试访问 name1[5]。鉴于name 是一个大小为4 的char 数组,您正在访问与该数组无关的内存。可能在执行时内存恰好包含一个空字符,导致了这个结果。然而,这是无法预测的,因此行为是未定义

【讨论】:

    【解决方案2】:

    name1 没有定义 C 字符串,但 name2 可以。

    C 字符串是一个字符序列,最后一个是 NUL 字符。 C-string 不是类型,C 中没有字符串类型;但标准定义了 C-string 的概念。 strlen 应该用在 C 字符串上。

    您定义了字符数组。那是 C 中的一种类型:字符序列。然后一些字符数组包含 C 字符串,而另一些则不包含。 strlen 不应用于不包含 C 字符串的字符数组。

    name1[5] 不存在,该数组仅包含 5 个字符(0 到 4)。

    【讨论】:

      【解决方案3】:

      第一个和第二个数组的区别?

      1) 第一个数组是 4 个字符,第二个数组是 5 个字符

      2) 不能在第一个数组上使用 strlen(),strcpy(),strcmp()` 之类的函数,但可以在第二个数组上使用这些函数

      【讨论】:

        【解决方案4】:

        name1 的大小不是name2 的大小
        name1 的大小为 4
        name2 的大小为 5
        它从数组中知道 有人在寻址数组时忘记从0 而不是1 计数。这总是很烦人。 name1[5] 指向一个禁止的内存地址。这就是所谓的缓冲区溢出。

        【讨论】:

        • 确实,name1[5]name2[5] 的索引都超出了范围。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-14
        • 2017-06-26
        • 1970-01-01
        • 2011-01-28
        • 1970-01-01
        • 2010-09-17
        相关资源
        最近更新 更多