2013-09-30 35 views
3

從我使用C++開始已經很長時間了,在我的空閒時間裏一直使用Javascript,現在我不確定我記得的是什麼。用空格分隔字符串的最簡單方法是什麼?

基本上我只需要通過查看空格將字符串分成幾部分。

我看過的所有鏈接都是自制的功能,但我可以發誓,有一種方法可以通過使用流來使用標準庫來完成它,但同樣,我也很難回想起它和我的谷歌結果也沒有幫助。

請記住,它不是我正在使用的流,它只是一個字符串,如「Bob會計師65退休」,我必須將字符串中的每個項目提取到其自己的數據字段。我一直在搞亂ifstreams和ofstreams,但我甚至不知道我在做什麼,忘記了它的語法。

+3

'strtok'可以使用。 http://www.cplusplus.com/reference/cstring/strtok/ – thefourtheye

+0

但是,如何將我的字符串轉換爲字符指針? –

+0

'std :: string :: c_str()'將返回空終止的字符串,用於需要以空字符結尾的字符串(如strtok)的C stdlib函數中。請注意,'strtok(...)'***在其*通常*形式中不是線程安全的***,所以下面的建議使用C++ stdlib的答案可能更通用/更健壯。 –

回答

5

std::strtok是C風格的方式來做到這一點。你可能會想使用std::stringstream,例如:

#include <sstream> 
#include <string> 
#include <iostream> 

int main() { 
    std::string input = "foo bar baz quxx\nducks"; 
    std::stringstream ss(input); 

    std::string word; 
    while (ss >> word) { 
     std::cout << word << '\n'; 
    } 
} 

運行時,它顯示:

foo 
bar 
baz 
quxx 
ducks 

如果你想從std::stringstream讀取數據(或任何類型的std::istream,真的)到一個特定的數據類型,你可以按照@ JerryCoffin的過載流operator>>爲您的數據類型的指教:

#include <sstream> 
#include <string> 
#include <iostream> 

struct Employee { 
    std::string name; 
    std::string title; 
    int age; 
    std::string status; 
}; 

std::istream& operator>>(std::istream &is, Employee &e) { 
    return is >> e.name >> e.title >> e.age >> e.status; 
} 

int main() { 
    std::string input = "Bob Accountant 65 retired"; 
    std::stringstream ss(input); 

    Employee e; 
    ss >> e; 

    std::cout << "Name: " << e.name 
     << " Title: " << e.title 
     << " Age: " << e.age 
     << " Status: " << e.status 
     << '\n'; 
} 
+0

如果我只是想將它們放在自己的數據字段中,而不是將它們顯示在控制檯上,我該怎麼辦? –

+0

使用std :: vector stringVect;您應該調用stringVect.push_back() – qxixp

+0

@ user2419560,而不是調用cout:我已更新此答案以包含將數據讀入結構中的第二個示例。 –

3

你可以不用這樣明確的循環:

string s = "Bob Accountant 65 retired"; 
vector<string> vs; 
istringstream iss(s); 
copy(istream_iterator<string>(iss), istream_iterator<string>(), back_inserter(vs)); 

std::copy讀一切從第三行創建的字符串流,並將其推到在第二行創建的載體。

這裏是demo on ideone

1

從外觀看,你試圖從字符串中讀取邏輯記錄。對於這一點,我會做這樣的事情:

struct record { 
    std::string name; 
    std::string position; 
    int age; 
    std::string status; 
}; 

std::istream &operator>>(std::istream &is, record &r) { 
    return i >> r.name >> r.position >> r.age >> r.status; 
} 

這可讓您從指定的字段的stringstreamrecord數據。順帶一提,它還會讓你從其他類型的流中讀取record對象(例如,使用fstream的文件)。

相關問題