在许多代码示例中,人们通常使用'\0'
创建一个新的 char 数组后,如下所示:
string s = "JustAString";
char* array = new char[s.size() + 1];
strncpy(array, s.c_str(), s.size());
array[s.size()] = '\0';
我们为什么要使用'\0'
here?
您的问题的标题引用了 C 字符串。 C++std::string
对象的处理方式与标准C字符串。\0
当使用 C 字符串时,以及当我使用术语时,这一点很重要string在这个答案中,我指的是标准 C 字符串.
\0
在 C 中充当字符串终止符。它被称为空字符, or NUL,标准 C 字符串是空终止。该终止符表示处理字符串的代码 - 标准库,但也可以是您自己的代码 - 字符串结尾所在的位置。一个很好的例子是strlen
它返回字符串的长度:strlen
使用以下假设进行工作:它对使用以下命令终止的字符串进行操作\0
.
当您使用以下方式声明常量字符串时:
const char *str = "JustAString";
那么\0
会自动为您附加。在其他情况下,您将像数组示例一样管理非常量字符串,有时需要自己处理它。这strncpy 的文档您的示例中使用的 是一个很好的说明:strncpy
复制空终止符except在复制整个字符串之前达到指定长度的情况。因此你会经常看到strncpy
结合可能是多余的空终止符的分配。strlcpy
and strcpy_s
旨在解决因忽视处理此案而产生的潜在问题。
在你的具体例子中,array[s.size()] = '\0';
就是这样一种冗余:因为array
是有尺寸的s.size() + 1
, and strncpy
正在复制s.size()
字符,该函数将附加\0
.
标准 C 字符串实用程序的文档将指出何时需要小心包含这样的空终止符。但请仔细阅读文档:与strncpy
细节很容易被忽视,导致潜在的缓冲区溢出。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)