2010-07-08 46 views
2

我們:將STL字符串數組轉換爲const char *數組的最有效方法是什麼?

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[]」?

+7

索引是以C++爲基礎的。所以你的意思是'string_array [0]'和'string_array [1]' – 2010-07-08 19:57:06

+0

是的,當然,謝謝 – hoxnox 2010-07-08 20:11:39

+0

函數如何使用const char * cstring_array []? – 2010-07-08 20:28:03

回答

12

函數採用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()); 
} 
+0

對不起,我犯了一個錯誤。函數需要const char * array []。常量char *字符串的數組。 – hoxnox 2010-07-08 20:11:54

+0

真棒!謝謝!!! – hoxnox 2010-07-08 21:10:03

3

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

參見c_str()

const的圖表* c_str() 常量basic_string的返回指向 到的表示所述 字符的空終止陣列字符串的 內容。

+0

對不起,我犯了一個錯誤。函數需要const char * array []。常量char *字符串的數組。 – hoxnox 2010-07-08 20:09:20

4

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

+0

對不起,我犯了一個錯誤。函數需要const char * array []。常量char *字符串的數組。 – hoxnox 2010-07-08 20:12:37

1

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

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

+0

或即使您修改字符串而不釋放它。緩衝區可以被重新分配並被更大的一個替換。 – 2010-07-08 20:01:11

+0

對不起,我犯了一個錯誤。函數需要const char * array []。常量char *字符串的數組。 – hoxnox 2010-07-08 20:08:29

0

真的有兩個不同的問題。要傳遞給函數,只需致電c_str()。要複製簡單的電話strncpy(),並記住我所說的傳遞函數。

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

+0

對不起,我犯了一個錯誤。函數需要const char * array []。常量char *字符串的數組。 – hoxnox 2010-07-08 20:08:50

+0

然後您需要將它們單獨複製到陣列中。沒有一套功能可以暫時將其轉換爲另一種功能。 – 2010-07-08 20:22:58

+0

也許有一種方法可以訪問內存,分配在STL字符串中?而一些「魔術」使這個內存看起來像const char *數組?我是一個deramer =)) – hoxnox 2010-07-08 20:36:20

0

它看起來像你有麻煩的數組。正如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陣列包含機器人^ h字符串(這是我的問題的解釋的可能性),那麼你真的是你想要做的就是要產生一個字符串是你原來的兩個串聯:

... 
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*的數組。我懷疑原因是這樣的: - 這不是經常需要做的事情,所以幾乎沒有要求這樣的功能被廣泛使用。 - 如果有這樣的功能,它很可能與上述非常相似,在這種情況下,它是如此微不足道,以至於不必要。

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

+0

> for(int i = 0; i cstring_array [i] = string_array [i] .c_str(); 但是,在這種情況下,我必須分配內存到cstring_array。也許有更好的方法?訪問由STL字符串數組分配的內存,或者smth ...? – hoxnox 2010-07-08 20:32:04

相關問題