【问题标题】:Does the '\0' at the end of the string also get included here?字符串末尾的 '\0' 是否也包含在此处?
【发布时间】:2012-04-15 12:22:56
【问题描述】:

如果我这样声明一个包含 10 个元素的字符串:

char s[10];

那么最后的'\0'是占据第10位还是第11位呢?基本上我的问题是我们是否在字符串中少了 1 个元素?

如果我使用 strlen() 函数来查找这个字符串的长度,返回值是否包含 null?即如果字符串是“男孩”,函数会给我 3 还是 4?

【问题讨论】:

  • \0 可以插入从索引 0 到索引 9(含)的任何位置。不能出现在索引10(这里的索引范围是0-9)。
  • 当您使用 C++ 时,我会指出您应该使用字符串类而不是 char 的数组(或 char* 就此而言 [仅供参考,不完全相同])虽然我相信您正在研究嵌入式的东西,这就像一些没有任何意义的替代现实。

标签: c++ string strlen


【解决方案1】:

没有第 11 位,也就是说,是的,它少了一个要使用的元素。

不要在其中放置超过 9 个字符的字符串。 Strlen() 不包含空终止符。

例如:

char s[]="hello"; 

s 是 6 个字符的数组,但 sstrlen() 是 5。

【讨论】:

  • 由于这是标记为 C++,我认为这是一个安全的假设 :-)
  • 我知道那些是有某种目的的;)
  • Modula2 是一种不同的语言示例。如果字符数等于数组计数,则省略终止 null。所有函数的行为都类似于 C "-n" 变体,必须为每个操作传递缓冲区的上限,以允许运行时处理这种情况。
  • 为了公平起见赞成这个,因为 OP 似乎无论如何都不接受任何答案。
【解决方案2】:

是的,\0 字符将占据第 10 位。意思是,字符串将只包含 9 个输入字符。不,strlen() 不计算空字符。

【讨论】:

    【解决方案3】:

    如果你声明一个这样的数组,它不需要在末尾有一个零字节。如果你调用任何需要字符串的函数,它几乎肯定会导致崩溃。你需要初始化数组:

    char s[] = "This is a test."
    

    如果你这样做:

    char s[10] = "012345678"
    printf("%d\n", strlen(s));
    

    它显然会打印 9。你不能在该数组中放置 10 个字符,因为空字节会被写入数组边界之外。

    【讨论】:

      【解决方案4】:

      如果您声明一个包含 10 个字符的数组,您必须记住其中一个必须用作字符串终止符,因此您最多可以存储 9 个字符。

      strlen,相反,只返回“逻辑”字符的数量,即它不会计算空终止符。

      【讨论】:

        猜你喜欢
        • 2014-11-22
        • 2021-02-09
        • 2022-01-02
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多