char* convert()
{
std::string data = "stackoverflow"/span>;
return data.c_str()。
這將回傳指標,當呼叫者從它那里構建字串時,它將有stack而不是完整的字串。在c 11中,有什么解決方法可以不改變輸入和回傳型別嗎? 我想在呼叫者一方從char*重建整個字串。
uj5u.com熱心網友回復:
當字串中間有空號時,將std::string轉換為char*
為了將一個中間有空號的std::string轉換為char*,你必須先有一個中間有空號的std::string。你并沒有這樣的字串。
因為你使用了建構式std::string(const char*),你創建的字串將傳遞的指標視為指向空結尾的字串的第一個元素的指標,因此std::string只包含 "stack"。
你可以使用:
const auto& str = "stackoverflow"/span>。
std::string data(str, std::size(str) - 1)。
這將回傳堆疊而不是完整的字串
如果字串實際包含 "stackoverflow",那么c_str將回傳一個指向完整字串 "stackoverflow "的第一個元素的指標。
如果你將該指標視為指向空終止的字串的指標,那么第一個空終止符將終止空終止的字串。如果你把指標當作一個指向空結束的字串的指標,就沒有辦法避免。所以,如果你想避免字串被第一個空終止符終止,那么就不要把它當作一個指向空終止字串的指標(比如在你的例子中,你把字串字面作為指向空終止字串的指標)。
然而,這主要是一個沒有實際意義的問題,因為當函式回傳時,被指向的字串將被取消分配,回傳的指標將被懸空。試圖通過懸空的指標訪問將導致未定義的行為。
此外,c_str總是回傳一個
const char*而不是char*。uj5u.com熱心網友回復:
為了能夠使用帶有's的完整字串安全地.你必須把資料放在一個緩沖區。 例如,像這樣 :
#include <iostream> #include <array> #include <vector> template<std::size_t N> auto make_buffer(const char(& chars)[N]) { //注意檢索一個物件時使用RVO,沒有任何東西是懸空的。 std::array<char, N> buffer{}; for (std::size_t n = 0; n < N; n) buffer[n] = chars[n] 。 return buffer。 } int main() { auto buffer = make_buffer(the stackoverflow")。 // this is the closest you can get to having a char*. ///指向所有的資料。。 char* data_ptr = buffer.data()。 //但是你仍然必須依賴緩沖區的大小。 //為正確地在有效值上回圈!。 for (std::size_t n = 0; n < buffer.size(); n) { std::cout << data_ptr[n]; } std::cout << std::endl; //但是對于這樣的一個緩沖區,建議使用基于范圍的for回圈。 for (const auto c : buffer) { std::cout << c; } std::cout << std::endl; return 0;轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/324431.html
標籤:
