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

std::string_view 是 C++17 新加的一個類,是字符串的無全部權引用。對 std::string_view 的操做都不會生成新字符串(好比 substr),而是返回一個新的 string_view 可是引用原字符串。c++

這樣效率是有提高,可是帶來一個問題就是:std::string_view 沒有 c_str 方法。函數

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

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

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

printf("%.*s", int(sv.length()), sv.data());
相關文章
相關標籤/搜索