在只读情况下,什么时候需要空终止的字符串?


10

我一直在研究该std::string_view库,并且一直在考虑更改我一直在努力使用的代码库std::string_view。但是,在我阅读过的许多主题中,有关何时何地使用std::string_view而不是的主题const std::string &。我已经看到许多答案说:“何时不需要以null结尾的字符串。” 因此,当我开始在网上搜索“何时需要以null结尾的字符串?” 在这个问题上,我还没有真正有用的答案。

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

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

我看过的链接:

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

5
主要用于与C API交互。
胡桃木

@uneven_mark您可以举一个例子吗?
Sailanarmo

您链接的第四个问题的公认答案似乎像它回答了这个问题。
弗朗索瓦·安德列

1
@Sailanarmo来自POSIX或其他任何带有const char*参数的C库的大多数函数。eerorika的答案有一个例子。
胡桃木

1
@FrançoisAndrieux的答案确实是:“只要API不要求以null终止的字符串?”
Sailanarmo

Answers:


10

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

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

让我们以该功能execve(来自POSIX标准)为例:

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

如果将非空终止参数作为传递pathname,则程序的行为将不确定。


因此,在这种情况下,路径名是否为a std::string,将像这样执行execve(pathname.c_str(),...,...)
Sailanarmo

6

实际上很容易知道。如果您要调用的函数仅包含C字符串(char*/const char*),那么您需要一个以null终止的字符串,因为这是知道字符串结尾的唯一方法。

如果您有一个函数需要一个 char* / const char*加上大小,或者仅用两个指针标记数据的开始和结束,那么就不需要以null结尾的字符串,因为您可以/无需迭代就可以得到字符串的大小。空终止符。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.