2012-07-18 68 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()); 
相关问题