关于c ++:在循环中使用stringstream从几个字符串中提取数字

Using stringstream inside a loop to extract a number from few strings

我目前正在使用StringStreams从字符串中提取值。在这个简单的代码中,用户输入一个名称和一个数字(用空格分隔),这个字符串存储在"input"中。然后,它被传递到"stream"并将名称和编号分开,这些名称和编号存储在"name"和"number"中。然后,用STD::CUT输出数字。这个过程用不同的名称和数字进行了几次。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <sstream>
#include <iostream>

int main() {
    std::string input;
    std::stringstream stream;
    std::string name;
    double amount;

    for (;;) {
        std::getline(std::cin, input);      // enter a name, a whitespace and a number
        stream.str(input);
        stream >> name >> amount;           // problem here
        std::cout << amount << std::endl;

    }
    return 0;
}

问题:只有第一个输入的数字存储在"Amount"中。下一个输入的数字不会存储在"amount"中(amount中的数字始终相同)。也许,有一些我不知道的关于溪流…


问题是当调用str(string)时,读取位置未定义。因此,stream进入错误状态,这是一个证明。

修复它的最佳方法是在循环中移动stream的范围:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <sstream>
#include <iostream>

int main() {
    std::string input;
    std::string name;
    double amount;

    while (std::getline(std::cin, input)) {
        std::stringstream stream(input);
        stream >> name >> amount;
        std::cout << amount <<"" << name << std::endl;

    }
    return 0;
}

这是它工作的证据。实际上,最好在循环中移动更多的变量。


Problem: Only the number of the first entered input is stored in
"amount". The numbers of the next inputs will not be stored in
"amount" (amount always has the same number inside). Maybe, there is
something I don't know about stringstreams...

对。使用一次后,您忘记重置std::stringstream

为此,需要使用std::stringstream::str将基础序列(stringstream的内容)设置为空字符串,并使用clear将fail(如果有)和eof标志设置为空字符串。

也就是说,结束你的for循环,你需要这个:看现场

1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
   ....
   ....
   for (;;)
   {
      ...
      ...
      stream.str( std::string() );   // or stream.str("");
      stream.clear();
   }
   return 0;
}


尝试使用输入字符串流std::istringstream,它专用于作为输入流(如std::cin)工作,与std::stringstream不同:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <sstream>
#include <iostream>

int main() {
    std::string input;
    std::istringstream stream; // Note the extra i
    std::string name;
    double amount;

    for (;;) {
        std::getline(std::cin, input);
        stream.str(input);
        stream >> name >> amount;
        std::cout << amount << std::endl;

    }
    return 0;
}

Input: Hello 3.14

Output: 3.14

Input: World 2.71

Output: 2.71