我試圖將一個字符串複製到緩衝區以便進一步處理。我使用的指令將字符串函數複製到非常量字符緩衝區
char *buf = line.c_str();
但buf
類型應該是const char*
,但是如果我要使用
const char *buf = line.c_str();
我的臉,我使用的是strtok_s
功能,用於處理buf
另一個問題。此功能期望char *
arg。而不是const char*
。 是否有其他功能或方法複製此行到char *
?
我試圖將一個字符串複製到緩衝區以便進一步處理。我使用的指令將字符串函數複製到非常量字符緩衝區
char *buf = line.c_str();
但buf
類型應該是const char*
,但是如果我要使用
const char *buf = line.c_str();
我的臉,我使用的是strtok_s
功能,用於處理buf
另一個問題。此功能期望char *
arg。而不是const char*
。 是否有其他功能或方法複製此行到char *
?
一種方法是使用標準庫中的容器,如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
試試這個。
char* buf = strdup(line.c_str());
// use strtok_s however you need
free(buf);
不能直接使用緩衝區而不修改它,因爲strtok_s確實會修改數據。 c_str
希望您單獨保留數據。
如果你不關心的修改,只是做:
char* buf = &line[0];
對於&line [0]的+1。 -1代表'strdup(line.c_str())'。最終得分 - 零。 –
使用的基礎數據你不準叫' strtok'直接作用於'.c_str()'的結果,因爲'strtok'修改了它的參數/緩衝區。要使用'strtok',你必須首先完成一個完整的拷貝並使用它。 –
'const char * buf = line.c_str();'不是副本,您只是獲取字符串的地址。這個字符串是不可變的,因爲它是由你得到的std :: string所擁有的。你需要將它複製到某處mutable - 你自己的char []緩衝區或strdup緩衝區,否則你需要使用std :: string成員直接操作字符串。 (請記住,strtok實際上會修改源字符串) – kfsone