2012-07-18 84 views
2

我得到這個簡單的程序讀取像「13 11 9 10」字符串。我想拆分字符串然後對它們進行排序。然而sort()似乎不起作用,有幫助嗎? 輸入:13 11 9 10 ,輸出:13 11 9 10 謝謝!爲什麼sort()不起作用?

#include <string> 
#include <sstream> 
#include <iostream> 
#include <algorithm> 
#include <vector> 
using namespace std; 

vector<int> split(string s) 
{ 
    istringstream iss(s); 
    vector<int> result; 

    do{ 
     string sub; 
     iss>>sub; 
     if(sub!="") 
      result.push_back((int)atoi(sub.c_str())); 
    }while(iss); 

    return result; 
} 
int main(void) 
{ 
    string s; 
    while(cin>>s) 
    { 
     vector<int> vec; 
     vec=split(s); 
     sort(vec.begin(), vec.end()); 
     for (int i = 0; i < vec.size(); ++i) 
     { 
      cout<<vec[i]<<endl; 
     } 
    } 
} 
+1

http://liveworkspace.org/code/c42d25b1ae979db4044c8cb4b5d3cb51它的工作原理。 – ForEveR 2012-07-18 07:01:09

+0

問題不在於'std :: sort()',而在於'split(string)'方法。 – iammilind 2012-07-18 07:02:26

+0

問題出在'cin >> s',它已經分割你的輸入字符串。嘗試使用'getline()'來代替。 – timrau 2012-07-18 07:05:31

回答

9

這是因爲cin >> s停在第一個空白處。

換句話說,如果輸入1 4 2 3s只包含1,而不是整行。

相反,使用以下方法來讀取整個行:

std::getline(std::cin, s); 
+2

另外,請不要使用atoi,請看這裏http://stackoverflow.com/questions/200090/how-do-you-convert-ac-string-to-an-int – 2012-07-18 07:10:54

+1

我發現值得一提的是,我沒有在鏈接的任何地方看到std :: stoi,或者它的重複。如果可用,這可能是最好的方法。 – chris 2012-07-18 07:20:28

+0

@chris如果可用;它是C++ 11的一部分。從規範來看,它似乎遭受與atoi相同的問題:沒有真正的錯誤檢查是可能的。最後,你必須使用'strtol',將'errno'設置爲0,然後將指針傳遞到'strtol'將存儲結束指針的地方,然後驗證errno == 0 &&結束!=開始&& *結束=='\ 0''。 – 2012-07-18 07:46:24

0

你的代碼的主要部分是不正確,CIN已經分裂成數據部分,使用cin.getline與緩衝或什麼Cicida以上建議,我工作代碼看起來像這樣:

string s; 
char buffer[ 256 ]; 
do 
{ 
    cin.getline(buffer, 255); 
    s.assign(buffer); 
    vector<int> vec; 
    vec=split(s); 
    sort(vec.begin(), vec.end()); 
    for (int i = 0; i < vec.size(); ++i) 
    { 
     cout<<vec[i]<<endl; 
    } 
}while(!s.empty()); 
相關問題