在只读场景中什么时候需要空终止字符串?
When do you need a null terminated string in a read-only scenario?
我一直在研究 std::string_view
库,我一直在考虑更改我一直在努力的代码库以尽可能多地使用 std::string_view
。但是,在我阅读过的许多关于何时何地使用 std::string_view
而不是 const std::string &
的话题中。我看到很多答案都说,"When you don't need a null terminated string." 所以当我开始在网上搜索时,"when do you need a null terminated string?" 我没有真正找到关于这个主题的任何有用的答案。
我能想到一个外部库的例子,你会 link 需要 std::string
。在这种情况下,您将需要一个空终止字符串,因为该库需要它。我想另一个例子是如果你需要修改字符串本身,但是如果我们需要修改它,我们就不会通过 const &
传递它。
那么什么时候需要使用空终止字符串?
我看过的链接:
- When would I pass const& std::string instead of std::string_view?
- Why only string view?
When do you need a null terminated string?
只要您使用的 API 表明您需要它,您就需要一个以空字符结尾的字符串。此要求在 C 接口中无处不在,并且未在某些文档中明确说明。如果函数参数是 char*
(可能是 const),并且没有长度参数,除非文档另有说明,否则您应该假定该要求。
我们以函数execve
(来自POSIX标准)为例:
int execve(const char *pathname, char *const argv[], char *const envp[]);
如果您将非空终止参数作为 pathname
传递,那么您的程序的行为将是未定义的。
其实很容易知道。如果您正在调用一个只接受 c 字符串 (char*
/const char*
) 的函数,那么您需要一个以 null 结尾的字符串,因为这是知道字符串结尾在哪里的唯一方法。
如果你有一个函数接受 char*
/const char*
加上大小,或者只是两个标记数据开始和结束的指针,那么你不需要 null终止字符串,因为您 have/can 获取字符串大小而不迭代到空终止符。
我一直在研究 std::string_view
库,我一直在考虑更改我一直在努力的代码库以尽可能多地使用 std::string_view
。但是,在我阅读过的许多关于何时何地使用 std::string_view
而不是 const std::string &
的话题中。我看到很多答案都说,"When you don't need a null terminated string." 所以当我开始在网上搜索时,"when do you need a null terminated string?" 我没有真正找到关于这个主题的任何有用的答案。
我能想到一个外部库的例子,你会 link 需要 std::string
。在这种情况下,您将需要一个空终止字符串,因为该库需要它。我想另一个例子是如果你需要修改字符串本身,但是如果我们需要修改它,我们就不会通过 const &
传递它。
那么什么时候需要使用空终止字符串?
我看过的链接:
- When would I pass const& std::string instead of std::string_view?
- Why only string view?
When do you need a null terminated string?
只要您使用的 API 表明您需要它,您就需要一个以空字符结尾的字符串。此要求在 C 接口中无处不在,并且未在某些文档中明确说明。如果函数参数是 char*
(可能是 const),并且没有长度参数,除非文档另有说明,否则您应该假定该要求。
我们以函数execve
(来自POSIX标准)为例:
int execve(const char *pathname, char *const argv[], char *const envp[]);
如果您将非空终止参数作为 pathname
传递,那么您的程序的行为将是未定义的。
其实很容易知道。如果您正在调用一个只接受 c 字符串 (char*
/const char*
) 的函数,那么您需要一个以 null 结尾的字符串,因为这是知道字符串结尾在哪里的唯一方法。
如果你有一个函数接受 char*
/const char*
加上大小,或者只是两个标记数据开始和结束的指针,那么你不需要 null终止字符串,因为您 have/can 获取字符串大小而不迭代到空终止符。