C++:string_view 與 C API 的互操作性

std::string_view 是 C++17 新加的一個類,是字符串的無所有權引用。對 std::string_view 的操作都不會生成新字符串(比如 substr),而是返回一個新的 string_view 但是引用原字符串。

這樣效率是有提升,但是帶來一個問題就是:std::string_view 沒有 c_str 方法。

string_view 所引用的字符串很有可能不是 \0 結尾的(Null-terminated byte strings),大多數 C API 都要求零結尾字符串,導致 string_view 和 C 函數互操作性很差(請不要不加考慮直接把 string_view#data() 傳給 C 函數)。

某些 C 函數接受長度參數,比如 fwrite,還有某些函數雖然沒有顯式的要求你傳字符串長度,但是也可以指定,比如 printf。

大家都知道 printf 輸出字符串的方式是 %s(請不要把字符串當格式化自字符串直接輸出),其實 %s 還能接受一些參數,完整形式是:%.Ns。其中 N 代表字符串中輸出字符的個數,截取前三個字符輸出就是 %.3s。更強大的是 N 可以是字符 *,代表輸出的字符通過參數傳入,所以通過 printf 家族輸出 string_view 的方式就是

printf("%.*s", int(sv.length()), sv.data());
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章