12

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

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

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

我看过的链接:

  1. std::string_view 到底比 const std::string& 快多少?
  2. 我什么时候会通过 const& std::string 而不是 std::string_view?
  3. 为什么只有字符串视图?
  4. 在 C++17 中使用 const std::string& 参数是否有意义?
4

2 回答 2

10

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

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

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

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

如果您将非空终止参数作为 传递pathname,那么您的程序的行为将是未定义的。

于 2019-11-22T20:43:23.243 回答
6

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

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

于 2019-11-22T20:43:31.417 回答