【问题标题】:When do you need a null terminated string in a read-only scenario?在只读场景中何时需要以空字符结尾的字符串?
【发布时间】:2020-03-18 22:46:18
【问题描述】:

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

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

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

我看过的链接:

  1. How exactly is std::string_view faster than const std::string&?
  2. When would I pass const& std::string instead of std::string_view?
  3. Why only string view?
  4. Is there sense in using const std::string& arguments in C++17?

【问题讨论】:

  • 主要是与 C API 接口。
  • @uneven_mark 你能举个例子吗?
  • 您链接的第四个问题的接受答案似乎回答了这个问题。
  • @Sailanarmo 大多数功能来自例如POSIX 或任何其他采用 const char* 参数的 C 库。 eerorika 的回答就是一个例子。
  • @FrançoisAndrieux 所以真正的答案是,“只要 API 不调用空终止字符串?”

标签: c++ string c++17 string-view


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 所以在这种情况下,路径名,如果是std::string,会像execve(pathname.c_str(),...,...)一样执行?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多