簡體   English   中英

將STL字符串數組轉換為const char *數組的最有效方法是什么?

[英]What is the most efficient way to convert STL string array to const char* array?

我們有:

 std::string string_array[2];

 string_array[0] = "some data";

 string_array[1] = "some more data";

 char* cstring_array[2];

將數據從string_array復制到cstring_array的最有效方法是什么? 或者將string_array傳遞給函數,需要“ const char* cstring_array[] ”?

采用char const *函數只能寫入一次接受一個字符串,而不是字符串數組。 要將std::string傳遞給這樣的函數,只需使用your_string.c_str()作為參數調用該函數。

編輯:對於一個采用字符串數組的函數,顯而易見的選擇(至少對我而言)是編寫一個允許傳遞vector<std::string>的最小前端:

// The pre-existing function we want to call.
void func(char const *strings[], size_t num) { 
    for (size_t i=0;i<num; i++)
        std::cout << strings[i] << "\n";
}

// our overload that takes a vector<string>:
void func(std::vector<std::string> const &strings) { 
    std::vector<char const *> proxies(strings.size());

    for (int i=0; i<proxies.size(); i++)
        proxies[i] = strings[i].c_str();
    func(&proxies[0], proxies.size());
}

使用string::c_str獲取指向char的const指針。

只需使用:
string_array[0].c_str()
string_array[1].c_str()

請參閱c_str()

const charT * c_str()const basic_string返回指向以null結尾的字符數組的指針,這些字符表示字符串的內容。

您可以通過將string_array [1] .c_str()傳遞給需要字符串的任何函數來訪問c-string版本。

但請注意,返回的指針依賴於stl :: string! 如果你拿指針然后釋放字符串,你將有一個無效的指針

兩個不同的問題,真的。 要傳遞給函數,只需調用c_str() 復制只需調用strncpy()並記住我所說的關於傳遞給函數的內容。

請記住,std :: string可以包含'\\ 0'而不實際終止。 在這種情況下,你只會獲得部分字符串。 如果您嘗試復制此類數據,則需要使用memcpy()

看起來你在使用數組時遇到了一些麻煩。 正如Brian指出的那樣,數組索引從0開始而不是1.因此你的兩個stringsstring_array[0]string_array[1]而不是 string_array[1]string_array[2]

此外,如果您的函數采用參數const char* cstring_array ,那么您的變量char* cstring_array[2]可能不是您想要的。 如果你按原樣傳遞它,你實際上將傳入char** ,而不是char* ,因為你可以認為數組的名稱等同於指向其第一個元素指針

在您提出問題時,您可以執行以下操作(更正索引錯誤,並假設您提到的函數稱為myFunction ):

...
cstring_array[0] = string_array[0].c_str( );
cstring_array[1] = string_array[1].c_str( );

myFunction (cstring_array[0]);
myFunction (cstring_array[1]);
...

但是,一個簡單的等價物根本不需要cstring_array

...
myFunction (string_array[0].c_str( ));
myFunction (string_array[1].c_str( ));
...

或者,如果你的目的是傳遞一個包含兩個字符串的char數組(這可能是我對問題的解釋),那么你真正想要做的是你想要產生一個字符串作為你的串聯原來的兩個:

...
std::string str = string_array[0] + string_array[1];

myFunction (str.c_str( ));
...

希望有所幫助!

編輯:鑒於我寫這篇文章后出現的評論,我會說第一個例子接近你所需要的。 我會做以下(其中N是任一數組中的條目數):

...
for (int i = 0; i < N; i++)
    cstring_array[i] = string_array[i].c_str( );

myFunction (cstring_array);
...

這是唯一可行的方法。 沒有標准函數(AFAIK),給定一個string數組將給出一個char*數組。 我懷疑原因是: - 這不是經常需要做的事情,所以幾乎沒有人要求廣泛提供這樣的功能。 - 如果有這樣的功能,它很可能與上述非常相似,在這種情況下它是如此微不足道,以至於沒有必要。

基本上,為了回答你的問題,我認為沒有更有效的方法,即使有一個標准的庫函數來做到這一點,它仍然會使用這種方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM