【问题标题】:Space for Null character in c stringsc字符串中空字符的空格
【发布时间】:2013-08-05 08:56:26
【问题描述】:

何时需要为 C 字符串中的 NULL 字符显式提供空格。
例如
尽管我没有声明 str 为 7 个字符长,即字符串的字符加上 NULL 字符,但此操作没有任何错误。

#include<stdio.h>

int main(){
    char str[6] = "string";
    printf("%s", str);
    return 0;
}

虽然在这个问题https://stackoverflow.com/a/7652089用户说
"如果您稍后需要修改字符串,但知道它不会超过 40 个字符(或 39 个字符后跟空终止符,具体取决于上下文),这很有用。"

取决于上下文”是什么意思?

【问题讨论】:

  • 我猜在这种情况下,您的 str 是一个 char 数组,因此您可以使用 sizeof 获得例如长度,但是如果您将 str 传递给函数,您将得到一个 char* 并且 sizeof 将给出另一个值

标签: c


【解决方案1】:

什么时候需要显式地为 C 字符串中的 NULL 字符提供空间?

总是。如果没有 \0 字符,则会导致 strcpystrlen 和通过 %s 打印的功能出现错误。它可能适用于某些示例(例如您自己的示例),但我不会对此打赌。

另一方面,如果您的字符串是二进制的并且您知道数据包的长度,则您不需要额外的空间。但是你不能使用str* 函数。无论如何,这不是你的问题。

【讨论】:

    【解决方案2】:

    这是错误的,关键字“缓冲区溢出”。内存被覆盖。

    char str[4] = "stringulation";
    char str2[20];
    printf("%s", str);
    printf("%s", str2);
    

    【讨论】:

      【解决方案3】:

      尝试在您未请求的某个地址上写入可能会导致数据损坏、随机输出或代码的未定义性质。

      【讨论】:

        【解决方案4】:

        您的代码调用了未定义的行为。您可能认为它有效,但代码已损坏。

        要存储一个包含 6 个字符和一个空终止符的 C 字符串,您需要一个长度为 7 或更多的字符数组。

        何时需要为 C 字符串中的 NULL 字符显式提供空间

        没有例外。 C 字符串必须始终包含一个空终止字符。


        “取决于上下文”是什么意思?

        那里的答案是区分您打算稍后修改的字符串变量或您不会修改的字符串变量。在前一种情况下,您可能会选择为初始内容分配比您需要的更多的内容,因为您希望以后能够添加更多。在后一种情况下,您可以简单地为初始值分配所需的字符数,仅此而已。

        【讨论】:

          【解决方案5】:

          0 终止符1 是各种库函数(strcpy()strlen()printf() 等)识别字符串结尾的方式。当你调用像

          这样的函数时
          char foo[6] = "hello";
          printf( "%s\n", foo );
          

          数组表达式foo在传递给函数之前被转换为指针值,所以函数接收的只是第一个字符的地址;它不知道foo 数组有多长。所以它需要一些方法来知道字符串的结尾在哪里。如果 foo 没有为 0 终止符提供的空间,printf() 将继续打印超出数组末尾的字符,直到它看到一个 0 值字节。


          1。我更喜欢使用术语“0 终止符”而不是“NULL 终止符”,只是为了避免与 NULL 指针混淆,这是另一回事。

          【讨论】:

          • 其实“NULL 终止符”这个词是不正确的,因为NULL,顾名思义,就是一个指针。 '\0' 字符实际上被命名为“null”,因此是“null 字符”。我认为“终止空字符”或“字符串终止空字符”表达得最好。此外,在字符串上下文中,说“'\0' terminator”比说“0 terminator”更准确
          猜你喜欢
          • 1970-01-01
          • 2020-10-30
          • 2017-09-26
          • 2014-05-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-29
          • 1970-01-01
          相关资源
          最近更新 更多