在只读方案中,何时需要以 null 结尾的字符串?
When do you need a null terminated string in a read-only scenario?
我一直在玩std::string_view
库,我一直在考虑更改我一直在努力的代码库,以尽可能多地使用std::string_view
。但是,在我读到的许多关于何时何地使用std::string_view
而不是const std::string &
的主题的线程中。我看到很多答案说,"当你不需要以空结尾的字符串时。因此,当我开始在网上搜索"你什么时候需要一个以 null 结尾的字符串?我还没有真正遇到任何关于这个主题的有用答案。
我可以想到一个外部库的示例,您将链接到该库需要std::string
。在这种情况下,您将需要一个以 null 结尾的字符串,因为该库需要它。我想另一个例子是,如果你需要修改字符串本身,但如果我们需要修改它,我们不会通过const &
传递它。
那么什么时候需要使用以空结尾的字符串呢?
我看过的链接:
- std::string_view 究竟如何比 const std::string& 快?
- 我什么时候会传递const& std::string而不是std::string_view?
- 为什么只有字符串视图?
- 在 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*
加上大小,或者只有两个标记数据开头和结尾的指针,那么你不需要一个以空结尾的字符串,因为你有/可以在不迭代到空终止符的情况下获取字符串大小。
- 是否有通用方法可以找到任何以 null 结尾的字符串的长度?
- 将以 null 结尾的字节字符串转换为原始字符串文本
- 在只读方案中,何时需要以 null 结尾的字符串?
- C++ - 创建具有相同字符的特定大小的以 null 结尾的 c 样式字符串的更好方法
- 以 Null 结尾的字符串的"NULL"或" "符号是否存储在文件中?
- std::string 的 c_str() 函数如何返回以 null 结尾的字符串?
- 为什么具有单独字符的字符数组不像字符串文字那样以 null 终止符结尾?
- 为 C 绑定创建动态以 null 结尾的参数
- 从 getline() 返回以 null 结尾的字符串
- 为什么strlen()比手动循环检查以null结尾的字符快20倍
- WString 实现 - 返回以 null 结尾,我走的路是否正确
- std::string::c_str() 是否总是返回一个以 null 结尾的字符串
- 如何生成一个以非null结尾的c字符串
- 将以null结尾的char数组复制到符合缓冲区长度的std::字符串中
- C++将 char 复制到 char 数组(调试断言失败)时,字符串不是以 null 结尾的
- 字符串不以null结尾
- C/C++中以null结尾的字符串的长度
- C++ 中以 null 结尾的非空字符数组
- UTF-8 字符串的简单加密,其中结果为以 NULL 结尾的字符串
- 将以null结尾的字符串列表从外部函数返回到.NET中