在C ++中用空格分隔用户输入有什么更好的解决方案?

时间:2011-10-19 17:56:15

标签: c++

我正在阅读C ++ Primer并正在进行练习。它希望我获取用户的输入并按空格' '分隔。所以我提出了2个解决方案。

第一个解决方案:

vector<string> vector1;
string input;
string temp = ""; // temperary hold each word value in input.

string x1 = "";
char x2 = 'b';

x1 += x2;

cout << x1 << endl;

getline(cin, input);

input += " ";

for (string::size_type index = 0; index != input.size(); index++)
{
    if (!isspace(input[index]))
    {
        temp += input[index];
    }
    else
    {
        if (temp.size() > 0)
        {
            vector1.push_back(temp);
            temp = "";
        }
    }
}

第二个解决方案

vector<string> vector1;
string input;
string temp = ""; // temperary hold each word value in input.

string x1 = "";
char x2 = 'b';

x1 += x2;

cout << x1 << endl;

getline(cin, input);

//input += " ";

for (string::size_type index = 0; index != input.size(); index++)
{
    if (!isspace(input[index]))
    {
        temp += input[index];
    }
    else
    {
        if (temp.size() > 0)
        {
            vector1.push_back(temp);
            temp = "";
        }
    }
}

if (!temp.empty())
{
    vector1.push_back(temp);
}

它们之间的区别是第一个解决方案是为用户输入添加空间,而第二个解决方案检查我不添加最后一个字。我想知道哪一个更好地解决了这个问题?

如果有更好的解决方案,请告诉我。

3 个答案:

答案 0 :(得分:4)

我会这样写:

std::vector<std::string> data;

std::copy(std::istream_iterator< std::string>(std::cin), 
          std::istream_iterator< std::string>(),
          std::back_inserter(data));

它与@ K-ballo的答案几乎相同,只是我让std::copy直接从输入流(即std::cin)而不是std::stringstream读取。

演示:http://www.ideone.com/f0Gtc

-

或者你可以使用vector的构造函数,完全避免使用std::copy

 std::vector<std::string> data(std::istream_iterator<std::string>(std::cin), 
                               std::istream_iterator<std::string>());

你已经完成了!演示:http://www.ideone.com/Szfes

如果您觉得难以阅读,请改用:

 std::istream_iterator<std::string> begin(std::cin), end;
 std::vector<std::string> data(begin, end);

演示:http://www.ideone.com/PDcud

答案 1 :(得分:1)

在C ++中,读取空格分隔的值非常简单,并且内置于该语言中。我可能错了,但看起来你的事情过于复杂。

std::string line;
if (std::getline(std::cin, line)) {
    std::stringstream ss(line);
    std::vector<std::string> inputs_on_this_line(
              std::istream_iterator<std::string>(ss)
            , std::istream_iterator<std::string>()    );
    //do stuff with the strings on this line.
}

答案 2 :(得分:0)

您可以轻松地将流中的输入拆分为字符串分隔值,并将它们插入到带有以下内容的向量中:

string input;

... get the input, perhaps with getline(cin, input); ...

stringstream input_stream( input );
vector<string> vector1;

std::copy(
    (std::istream_iterator< std::string >( input_stream )), std::istream_iterator< std::string >()
  , std::back_inserter( vector1 )
);

std::istream_iterator< std::string >对将通过一次提取input_stream来迭代std::string(读取字符串直到找到空格字符)。 std::back_inserter会为push_back中的每个字符串调用vector