簡體   English   中英

C ++如何將字符串轉換為char *

[英]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 ++”的字符串標記方式。 看到這個問題:

如何在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM