在只读场景中什么时候需要空终止字符串?

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 & 传递它。

那么什么时候需要使用空终止字符串?

我看过的链接:

  1. When would I pass const& std::string instead of std::string_view?
  2. 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 获取字符串大小而不迭代到空终止符。