2013-06-02 106 views
0

我試圖將一個字符串複製到緩衝區以便進一步處理。我使用的指令將字符串函數複製到非常量字符緩衝區

char *buf = line.c_str(); 

buf類型應該是const char*,但是如果我要使用

const char *buf = line.c_str(); 

我的臉,我使用的是strtok_s功能,用於處理buf另一個問題。此功能期望char * arg。而不是const char*。 是否有其他功能或方法複製此行到char *

+1

使用的基礎數據你不準叫' strtok'直接作用於'.c_str()'的結果,因爲'strtok'修改了它的參數/緩衝區。要使用'strtok',你必須首先完成一個完整的拷貝並使用它。 –

+1

'const char * buf = line.c_str();'不是副本,您只是獲取字符串的地址。這個字符串是不可變的,因爲它是由你得到的std :: string所擁有的。你需要將它複製到某處mutable - 你自己的char []緩衝區或strdup緩衝區,否則你需要使用std :: string成員直接操作字符串。 (請記住,strtok實際上會修改源字符串) – kfsone

回答

1

一種方法是使用標準庫中的容器,如std::vector或C++ 14的std::dynarray

std::vector<char> v(line.begin(), line.end()); 

請記住,這複製line的字符沒有空終止\0。在這個意義上,緩衝區不代表一個字符串。如果您需要空終止(這是不是從問題明確),你必須手動添加:

v.push_back('\0'); 

然後你就可以通過

char* c1 = &v[0] 
char* c2 = v.data(); // c++11 
1

試試這個。

char* buf = strdup(line.c_str()); 
// use strtok_s however you need 
free(buf); 

不能直接使用緩衝區而不修改它,因爲strtok_s確實會修改數據。 c_str希望您單獨保留數據。

如果你不關心的修改,只是做:

char* buf = &line[0]; 
+0

對於&line [0]的+1。 -1代表'strdup(line.c_str())'。最終得分 - 零。 –