为什么C++中的字符串通常以'\0'结尾?

2023-12-05

在许多代码示例中,人们通常使用'\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(使用前将#替换为@)

为什么C++中的字符串通常以'\0'结尾? 的相关文章

随机推荐