在只读方案中,何时需要以 null 结尾的字符串?

When do you need a null terminated string in a read-only scenario?

本文关键字:结尾 null 字符串 方案 只读 何时需      更新时间:2023-10-16

我一直在玩std::string_view库,我一直在考虑更改我一直在努力的代码库,以尽可能多地使用std::string_view。但是,在我读到的许多关于何时何地使用std::string_view而不是const std::string &的主题的线程中。我看到很多答案说,"当你不需要以空结尾的字符串时。因此,当我开始在网上搜索"你什么时候需要一个以 null 结尾的字符串?我还没有真正遇到任何关于这个主题的有用答案。

我可以想到一个外部库的示例,您将链接到该库需要std::string。在这种情况下,您将需要一个以 null 结尾的字符串,因为该库需要它。我想另一个例子是,如果你需要修改字符串本身,但如果我们需要修改它,我们不会通过const &传递它。

那么什么时候需要使用以空结尾的字符串呢?

我看过的链接:

  1. std::string_view 究竟如何比 const std::string& 快?
  2. 我什么时候会传递const& std::string而不是std::string_view?
  3. 为什么只有字符串视图?
  4. 在 C++17 中使用 const std::string& 参数有意义吗?

什么时候需要以空结尾的字符串?

只要您使用的 API 表示您需要它,您就需要一个以 null 结尾的字符串。此要求在 C 接口中无处不在,并且在某些文档中没有明确说明。如果函数参数是一个char*(可能是 const(,并且没有长度参数,除非文档另有说明,否则您应该假设该要求。

让我们以函数execve(来自 POSIX 标准(为例:

int execve(const char *pathname, char *const argv[], char *const envp[]);

如果传递一个非 null 终止的参数作为pathname,则程序的行为将是未定义的。

这实际上很容易知道。 如果你调用一个只接受c字符串(char*/const char*(的函数,那么你需要一个以null结尾的字符串,因为这是知道字符串末尾在哪里的唯一方法。

如果你有一个函数,它接受一个char*/const char*加上大小,或者只有两个标记数据开头和结尾的指针,那么你不需要一个以空结尾的字符串,因为你有/可以在不迭代到空终止符的情况下获取字符串大小。