2012-05-04 23 views
0

我有已建立一些C +陣列如下:轉換字符串的非常量字符*

std:array<const char *, 4) test1 = {abc.c_str(), def.c_str(), ghi.c_str()}; 

其中abcdefghistd::string

我具有與本數組傳遞給另一個功能有以下原型: (int argc, char * argv[])

我應該如何修改數組,使non-const char*可以傳遞給abov e功能。或者我應該修改函數爲const char *。我不確定該函數是否嘗試修改char *,因爲此函數代碼不是我的,也不是當前可用的。
但是,無論如何,最好問我如何將非const char *數組傳遞給上述函數?

回答

1

這應該工作

abc.append(1, 0); // guarantee NUL termination 
def.append(1, 0); 
ghi.append(1, 0); 
std:array<char *, 4> test1 = {abc.data(), def.data(), ghi.data()}; 

abc.append(1, 0); 
def.append(1, 0); 
ghi.append(1, 0); 
std:array<char *, 4> test1 = {&abc[0], &def[0], &ghi[0]}; 
+0

+'strdup()'/'free()'在原型函數修改字符串的情況下。 –

+1

如果你不介意我問,'abc.c_str();'等什麼?它有什麼副作用? – chris

+0

@chris:它確保字符串內容後面跟着一個NUL字節。 –

2

如果有一種可能性,即該函數將修改字符串,你應該調整的字符串,該函數可以使用,那麼最大尺寸在返回時重新調整大小。

abc.resize(max); 
DoSomething(&abc[0]); 
abc.resize(strlen(&abc[0])); 

如果你知道一個事實,該函數可以修改字符串,那麼函數原型是騙你的。你可以說:

DoSomething(const_cast<char *>(abc.c_str())); 
+0

Scumbag函數原型。這是我所知道的唯一合理用途:彌補別人的錯誤。調整字符串的大小也很重要。 – chris

+0

'main'-style函數不能增加作爲參數傳入的字符串的長度,即使它修改了它們(例如,它可以使用'strtok') –

+0

@BenVoigt,'main'-style函數不會收到'字符串'它會收到'char *'s。我想,如果你知道字符串的長度不會改變,你可以放棄一對'resize'。 –