将std :: string_view与API一起期望为空终止字符串

Using std::string_view with api that expects null-terminated string

本文关键字:期望 终止 字符串 一起 string std view API      更新时间:2023-10-16

我有一种使用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_stringc_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字符相等。

,但对于为字符串视图编写自定义类可能是很好的选择。