[英]C++ How to convert string to char*
我需要將字符串轉換為char *以便在strtok_s中使用,並且無法弄明白。 c_str()轉換為const char *,它是不兼容的。
此外,如果有人可以向我解釋為什么第二個strtok_s函數(在循環內)是必要的,這將是一個很大的幫助。 為什么我需要明確地推進令牌而不是例如它所處的while循環,它隱式地連續地獲取文件的每一行。
while( getline(myFile, line) ) { // Only one line anyway. . . is there a better way?
char * con = line.c_str();
token = strtok_s( con, "#", &next_token);
while ((token != NULL))
{
printf( " %s\n", token );
token = strtok_s( NULL, "#", &next_token);
}
}
相關問題 。
使用strdup()
將c_str()
返回的const char *
復制到char *
(之后記得free()
)
請注意, strdup()
和free()
是C,而不是C ++,函數,你最好使用std::string
方法。
第二個strtok_s()是必需的,否則你的循環不會終止( token
的值不會改變)。
丹尼爾說,你可以去
strdup(line.c_str());
這比我最初提出的strcpy更好,因為它分配了必要的空間
你不能轉換為char *
因為那會允許你寫入std::string
的內部緩沖區。 為了避免使std::string
的實現可見,這是不允許的。
而不是strtok
,嘗試更多“類似C ++”的字符串標記方式。 看到這個問題:
strtok()
是一個設計糟糕的功能。 檢查您的文檔,看看您是否有更好的文檔。 BTW,永遠不要在任何類型的線程環境中使用strtok()
,除非你的文檔特別說它是安全的,因為它在調用之間存儲狀態並修改它所調用的字符串。 我假設strtok_s()
是一個更安全的版本,但它不會是一個非常安全的版本。
要將std::string
轉換為char *
,您可以執行以下操作:
char * temp_line = new char[line.size() + 1]; // +1 char for '\0' terminator
strcpy(temp_line, line.c_str());
並使用temp_line
。 您的安裝可能有strdup()
函數,它將復制上述內容。
你需要兩次調用strtok_s()
是他們做了不同的事情。 第一個告訴strtok_s()
它需要處理什么字符串,第二個字符串繼續使用相同的字符串。 這就是NULL參數的原因; 它告訴strtok_s()
繼續使用原始字符串。
因此,您需要一次調用來獲取第一個令牌,然后每個后續令牌一次。 他們可以結合類似的東西
char * temp_string_pointer = temp_line;
while ((token = strtok_s( con, "#", &next_token)) != NULL)
{
temp_string_pointer = NULL;
等等,因為這會用字符串指針調用strtok_s()
一次,然后用NULL
調用。 不要使用temp_line,因為你要delete[] temp_line;
經過處理。
你可能認為這很多擺弄,但這就是strtok()
和親戚通常所需要的。
strtok的工作方式如下:
首先從unril開始調用返回字符串,如果沒有找到分隔符,則調用所有字符串:
token = strtok_s(con, "#", &next_token);
使用NULL進行第二次調用允許您繼續解析相同的字符串以查找下一個分隔符:
token = strtok_s(NULL, "#", &next_token);
如果到達字符串的末尾,則下一次調用將返回NULL;
每當你有一個std::string
,你需要的是一個(可修改的)字符數組,那么你需要std::vector<char>
:
void f(char* buffer, std::size_t buffer_size);
void g(std::string& str)
{
std::vector<char> buffer(str.begin(),str.end());
// buffer.push_back('\0'); // use this if you need a zero-terminated string
f(&buffer[0], buffer.size()); // if you added zero-termination, consider it for the size
str.assign(buffer.begin(), buffer.end());
}
第二個strtok調用是在循環內部。 它會使您的令牌指針前進,以便您逐個打印出令牌,直到您打印出所有這些令牌,指針變為空並退出循環。
要回答你問題的第一部分,正如其他人所建議的那樣,c_str()只給你內部緩沖區指針 - 你不能修改它,這就是為什么它是const。 如果要修改它,則需要分配自己的緩沖區並將字符串的內容復制到其中。
如果你真的需要訪問字符串的內部緩沖區,那么如何: &*string.begin()
。 在某些情況下,直接訪問字符串的緩沖區非常有用, 在這里您可以看到這種情況。
您可以輕松編寫一個轉換例程,該例程將標記字符串並返回子字符串向量:
std::vector<std::string> parse(const std::string& str, const char delimiter)
{
std::vector<std::string> r;
if(str.empty())
return r;
size_t prev = 0, curr = 0;
do
{
if(std::string::npos == (curr = str.find(delimiter, prev)))
curr = str.length();
r.push_back(str.substr(prev, curr - prev));
prev = curr + 1;
}
while(prev < (int)str.length());
return r;
}
我想你可以先將字符串轉換為const char *,然后將const char *復制到char *緩沖區以供進一步使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.