【问题标题】:How does strlen giving the same output for {'1','1'} and {'1','1','\0'}?strlen 如何为 {'1','1'} 和 {'1','1','\0'} 提供相同的输出?
【发布时间】:2014-06-19 12:03:49
【问题描述】:

strlen() 被 null 终止,对吗?那么 char c[]={'1','1'} 和 char d[]={'1','1','\0'} 为什么在 strlen(c) 和 strlen (d) 被使用?

【问题讨论】:

  • \0 是字符串终止不为空的符号
  • c 数组中的第二个元素之后的内存中可能恰好有一个 0。
  • @AlexandruCimpanu C99 标准 将字符串称为“空终止”(例如 p303)。 OP 指的是空字符,而您可能正在考虑空指针或NULL(不保证是指针)。
  • @Pascal Cuoq 是的,但这并不意味着您可以使用 NULL 代替 \0\0 是空终止符。从这个问题我推断他不知道NULL\0之间的区别或者相似之处。
  • @AlexandruCimpanu 您的建议“......是字符串终止的符号不是空的”比在问题中使用“由空终止”作为“空终止”的小错误更令人困惑。您正在纠正一个 OP 没有犯的错误,并且您以一种与 C 标准中使用方式不相符的奇怪方式使用“null”一词。

标签: c arrays null strlen


【解决方案1】:

前者是未定义的行为;可以输出2,也可以输出500,终止你的程序或者毁掉你的电脑。

【讨论】:

    【解决方案2】:

    strlen(d) 会返回 2,这没问题。

    strlen(c) 将返回 >= 2。 如果位置 c+2 的字符 == '\0',那么你很幸运,strlen(c) 返回 2,但你不能对此有任何保证!

    【讨论】:

      【解决方案3】:

      strlen() 被 null 终止了吧?

      我认为使用错误的术语会引起一些混淆:“strlen”是 C 标准函数的名称;函数不是“由 null 终止”。如果您的意思是 strlen 应该适用于以 null 结尾的字符序列,其中“null-terminated”意味着 '\0' 是确定序列结尾的最终标记字符,那么是的:strlen 做到了.

      请注意,NULL(全部大写)通常定义为 0 的别名(在 stddef.h 中)。

      以上都说了,但是,您的示例中的两个字符数组 'c' 和 'd' 具有不同的内容。前者包含两个项目,后者包含三个项目。 strlen 的有效输入就是您的“d”数组。您的数组 'c' 不是以 null 结尾的。

      strlen 无论如何都返回正确长度的原因是分配“c”的区域在数组中的最后一项之后包含一个“\0”,这纯属偶然。

      【讨论】:

        【解决方案4】:

        只是你运气好。

        strlen() 函数将开始计数,直到找到 '\0'。

        在您的 d 字符串中,您将 '\0' 放在字符串的末尾。然后 strlen 函数返回 2 个字符。

        在你的第二个中,幸运的是,在你的记忆中你到处都有很多'\0',而你的 c 字符串末尾的字符是一个'\0'。因此,它返回相同的值;)

        【讨论】:

        • 如果某些事情由于未定义的行为而起作用,我会称之为 运气。
        【解决方案5】:

        \0 将字符串的终止字符标记为非 NULL。 strlen 在给定字符串时不计算终止字符,它会一直计数,直到找到 \0 然后停止并返回。

        写的时候也是

        char a[]="你好";

        这会分配 6 个内存空间,其中 5 个用于 hello,1 个用于 \0。 在大多数情况下 strlen(c) 不会是 2

        【讨论】:

        • 没有人在谈论NULL,除了你。
        猜你喜欢
        • 1970-01-01
        • 2017-11-28
        • 1970-01-01
        • 2018-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-03
        相关资源
        最近更新 更多