2013-02-10 48 views
0

下面的這個函數只需要一個字符串,該字符串用64位整數填充,每個值由一個分隔符分隔,它將被放入向量中。在C++中使用分隔符高效解析多個數字的函數

vector<unsigned long long int> getAllNumbersInString(string line, char delim){ 
    vector<unsigned long long int> v; 

    string word; 
    stringstream stream(line); 
    unsigned long long int num; 

    while(getline(stream, word, delim)) 
     num = atol(word.c_str()); 
     v.push_back(num); 
    } 

    return v; 
} 

此功能工作正常的情況下,例如,我們有「」作爲分隔符,但分隔符會失敗,如果在字符串變量‘線’的數據是這樣的:

 432 12332 2234 12399 

儘管看起來數據使用空格作爲分隔符,但使用上面的代碼,整個代碼將在邏輯上失敗。例如,白色空間之間的空白是未定義的,atol將返回0,並將這些零置入向量中。

爲了更好地防範這些不規則現象,我應該對這些代碼採取哪些措施?

+0

或許'stream >> num'就夠了? – WhozCraig 2013-02-10 17:44:28

回答

3

是有一些原因,你不能/不會隨便使用這樣的?:

while (stream >> num) 
    v.push_back(num); 

或者只是:

vector<unsigned long long int> getAllNumbersInString(string line) { 
    istringstream stream(line); 
    typedef unsigned long long int T; 

    vector<T> v((istream_iterator<T>(stream)), istream_iterator<T>()); 
    return v; 
} 

如果您必須處理除空白以外的分隔符,您可以創建一個ctype facet來規範如果還有什麼應該被視爲分隔符。

+0

我明白了。所以我們也可以這樣做。聽起來就像我現在需要徹底檢查C++一樣。我一直使用高級語言太久了...... – Karl 2013-02-10 18:35:38

1

可以讓輸入輸出流庫照顧空白的你:

unsigned long long int num; 
while(stream >> num) 
    v.push_back(num); 
相關問題