c字符串中空字符的空格

时间:2013-08-05 08:56:27

标签: c

何时需要在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个字符后跟空终止符,具体取决于上下文),这非常有用。

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

5 个答案:

答案 0 :(得分:4)

  

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

始终即可。没有\0字符会使strcpystrlen%s打印等功能出错。它可能适用于某些例子(比如你自己的),但我不打赌任何事情。

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

答案 1 :(得分:2)

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

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

  

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

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


  

“取决于具体情况”是什么意思?

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

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

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

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