I have a method that takes std::string_view
and uses function, which takes null terminated string as parameter. For example:
void stringFunc(std::experimental::string_view str) {
some_c_library_func(/* Expects null terminated string */);
}
The question is, what is the proper way to handle this situation? Is str.to_string().c_str()
the only option? And I really want to use std::string_view
in this method, because I pass different types of strings in it.
Unlike C-style strings and std::string , std::string_view doesn't use null terminators to mark the end of the string. Rather, it knows where the string ends because it keeps track of its length.
Actually, as of C++11 std::string is guaranteed to be null terminated. Specifically, s[s. size()] will always be '\0' .
If you use a non-null-terminated char sequence as a string, C functions will just keep going. It's the '\0' that tells them to stop. So, whatever happens to be in memory after the sequence will be taken as part of the string.
In computer programming, a null-terminated string is a character string stored as an array containing the characters and terminated with a null character (a character with a value of zero, called NUL in this article).
I solved this problem by creating an alternate string_view
class called zstring_view
. It's privately inherited from string_view
and contains much of its interface.
The principal difference is that zstring_view
cannot be created from a string_view
. Also, any string_view
APIs that would remove elements from the end are not part of the interface or they return a string_view
instead of a zstring_view
.
They can be created from any NUL-terminated string source: std::string
and so forth. I even created special user-defined literal suffixes for them: _zsv
.
The idea being that, so long as you don't put a non-NUL-terminated string into zstring_view
manually, all zstring_view
s should be NUL-terminated. Like std::string
, the NUL character is not part of the size of the string, but it is there.
I find it very useful for dealing with C interfacing.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With