2014-11-06 246 views
0

我已經從文件中取出所有的txt並逐行放入字符串數組中。我想分割這個字符串,以便我可以單獨保存在單獨的數組中。請告訴我shell是如何將字符串數組轉換爲char的。將字符串轉換爲字符

例如

string line[15]; // line[0] has : was there before 
        // line[1] has : then after 

char * pch; 
char *c = line.c_str(); // string to char (i am getting error here. Any body know?) 
    pch = strtok (c," "); 
    while (pch != NULL) 
    { 
    printf ("%s\n",pch); 
    pch = strtok (NULL, " "); 
    } 

錯誤:C2228:左 '.c_str' 必須具有類/結構/聯合

+1

'line'是不是一個字符串。它是一串字符串。你也許可以做'line [0] .c_str()'。你還需要使用'const char * pch;'或者你會得到另一個錯誤。 – 2014-11-06 18:33:20

+2

'line'是一個數組。它不是'class/struct/union'。你的意思是(例如)'char * c = line [0] .c_str();'?此外,您可以編寫自己的使用'std :: string'的令牌函數,而不是使用舊的c函數。 – clcto 2014-11-06 18:33:59

+0

爲了加入我最後的評論,我寫了一個'tokenize'函數,可以在https://github.com/clcto/utile/blob/master/src/utile.cpp行235 – clcto 2014-11-06 18:39:30

回答

2

string line[15];是一個字符串數組。所以當你有line.c_str();行是一個指向字符串的指針而不是字符串本身。指針沒有.c_str()方法,這就是編譯器抱怨的原因。 (指針沒有任何方法,因此編譯器會告訴你表達式的左邊必須是類/結構/聯合類型)。要解決這個問題,你需要索引到數組中以獲得一個字符串。你可以這樣做:line[0].c_str();

此外,你不能寫回由c_str()返回的任何東西,因爲它返回一個const指針。所以你需要先複製c_str的結果,然後再對它進行操作,如果你要改變它的話。

另外它可能值得一提的是,有C++的方式來做標記化,你可能會在這裏找到一些例子Split a string in C++?。上次我這樣做時,我已經在使用boost了,所以我使用了boost::tokenizer庫。

+0

找到。通過編寫char * c = line [0] .c_str();給我錯誤,但是當我用這種方式寫char * c = line [0] .c_str;不給我錯誤。 (我正在使用Visual Studio 2012),這是正確的? – user3440716 2014-11-06 18:38:29

+0

@ user3440716您需要使用像const char * c = line [0] .c_str()這樣的函數,因爲'c_str()'是一種您需要使用圓括號的方法。 – shuttle87 2014-11-06 18:49:43

+0

通過放置const它給出錯誤:'strtok':不能將參數1從'const char *'轉換爲'char *' – user3440716 2014-11-06 18:57:25

1

在C++中有更簡單的方法來實現這一點。 strtok函數是C函數,不能直接與std::string一起使用,因爲無法獲得對std::string中底層字符的可寫指針訪問。您可以使用iostream來直接在C++中獲取由文件中的空格分隔的單個單詞。

不幸的是,標準庫缺乏簡單,靈活,高效的方法來拆分任意字符上的字符串。如果您想使用iostream來完成除空格之外的其他內容,則會變得更加複雜。使用boost::splitboost::tokenizer Shuttle87的建議是一個很好的選擇,如果你需要更靈活的東西(它也可能更高效)。

下面是一個代碼示例從標準輸入文字閱讀,你可以使用幾乎相同的代碼與ifstream從文件或stringstream閱讀從一個字符串讀取:http://ideone.com/fPpU4l

#include <algorithm> 
#include <iostream> 
#include <iterator> 
#include <string> 

using namespace std; 

int main() { 
    vector<string> words; 
    copy(istream_iterator<string>{cin}, istream_iterator<string>{}, back_inserter(words)); 
    copy(begin(words), end(words), ostream_iterator<string>{cout, ", "}); 
    cout << endl; 
}