将std :: string_view与API一起期望为空终止字符串
Using std::string_view with api that expects null-terminated string
我有一种使用std::string_view
并使用函数的方法,该函数将NULL终止字符串作为参数。例如:
void stringFunc(std::experimental::string_view str) {
some_c_library_func(/* Expects null terminated string */);
}
问题是,处理这种情况的正确方法是什么?str.to_string().c_str()
是唯一的选择吗?我真的想在此方法中使用std::string_view
,因为我通过其中的不同类型的字符串。
我通过创建一个称为 zstring_view
的替代string_view
类解决了这个问题。它是从string_view
私下继承的,并包含其大部分接口。
主要区别在于不能从string_view
创建zstring_view
。另外,从末尾删除元素的任何string_view
API都不是接口的一部分,或者它们返回string_view
而不是zstring_view
。
可以从任何NUL终止的字符串源:std::string
等创建它们。我什至为它们创建了特殊的用户定义的文字后缀:_zsv
。
这个想法是,只要您不将非NUL终止的字符串手动地放入zstring_view
中,则所有zstring_view
s都应均已终止。像 std::string
一样,nul字符不是字符串大小的一部分,而是。。
我发现它对于处理C接口非常有用。
您不能通过std::string_view
改变字符串。因此,您无法添加终止的' '
字符。因此,您需要在其他地方复制字符串以添加' '
末端。如果足够短,则可以通过将字符串放在堆栈上来避免堆积。如果您知道,std::string_view
是零终端字符串的一部分,那么您可以检查,如果末尾的字符是' '
字符,并在这种情况下避免副本。除此之外,我没有更多的优化空间。
您当然不应该在std::experimental::string_view
上致电data
:
与basic_string :: data()和字符串文字不同,data()可以返回 指向未终止的缓冲区的指针。
所以请致电to_string
和c_str
:
void stringFunc(std::experimental::string_view str) {
some_c_library_func(str.to_string().c_str());
}
或:
void stringFunc(std::experimental::string_view str) {
std::string real_str(str);
some_c_library_func(real_str.c_str());
}
在某些情况下,c-态函数的函数过载,该函数接受字符串的长度作为单独的参数。
例如。不用使用strcasesmp()
,而是切换到strncasecmp()
。可以肯定的是,在这种特殊情况下,如果字符串不相等,则需要实现其他逻辑,但是前N字符相等。
,但对于为字符串视图编写自定义类可能是很好的选择。
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- 为什么这个 c++ 代码打印出长度 5,当我打印出字符串时,程序会自动终止?
- 当我在其中一个线程执行中(在activemq-cpp中)捕获到特定值时,我如何终止/停止所有其他线程
- llvm构建器向基本块添加终止符
- 如何使用隔离>终止执行来停止所有线程
- 从类型std::函数传递变量失败,尽管调用方期望的类型完全相同
- 用于将C++代码转换为 Web 程序集的脚本未终止
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- 终止 QProcess 不会终止子进程
- 一元*运算符的操作数是否期望一个 prvalue
- 运行代码时,c++ 会终止进程
- 检测到堆栈粉碎:已终止 中止(核心已转储)
- 在输入句子时终止 std::out_of_range
- 二进制搜索的终止点
- MPI:检查是否有任何进程已终止
- 英特尔 TBB 程序不会终止,可能会误用参考计数器
- 如何改进我的代码,使其不会因超时而终止?(黑客排名挑战)
- 将std :: string_view与API一起期望为空终止字符串