在只读场景下,何时需要使用以空字符结尾的字符串?

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. 为什么只使用string view?
  4. 在C++17中使用const std::string&参数是否有意义?

5
主要是为了与 C API 进行接口交互。 - walnut
1
@uneven_mark,你能提供一个例子吗? - Sailanarmo
你链接的第四个问题的被接受答案,似乎回答了这个问题。 - François Andrieux
1
@Sailanarmo 大多数函数(例如 POSIX 或任何其他 C 库)都需要一个 const char* 参数。eerorika 的回答中有一个例子。 - walnut
1
@FrançoisAndrieux所以真正的答案是,“只要API不要求空终止字符串?” - Sailanarmo
将string_view标准化是一个错误。你不知道未来何时需要与外部接口通信。如果发生这种情况,你将被迫复制字符串,这将消除任何性能上的优势。 - Richard Hodges
2个回答

10

何时需要一个以空字符结尾的字符串?

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

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

int execve(const char *pathname, char *const argv[], char *const envp[]);
如果您将一个非空终止的参数作为“pathname”,那么您的程序行为将是未定义的。

那么在这种情况下,如果路径名是一个 std::string,它将会像 execve(pathname.c_str(),...,...) 一样被执行? - Sailanarmo

6

实际上,要知道这很容易。如果你调用的函数只接受 C 字符串 (char*/const char*),那么你需要一个以空字符结尾的字符串,因为这是唯一能知道字符串结束位置的方式。

相反地,如果你调用的函数接受一个 char*/const char* 以及字符串大小或者只有两个指针标记数据的开始和结束位置,则不需要以空字符结尾的字符串,因为你已经/可以获得字符串大小而无需迭代到空终止符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接