在循环中使用 stringstream 从几个字符串中提取数字

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

我目前正在练习使用 stringstreams 从字符串中提取值。在这个简单的代码中,用户输入一个名字和一个数字(用 space 分隔),这个字符串存储在 "input" 中。然后,它被传递给 "stream" 并将名称和号码分开,存储在 "name" 和 "number" 中。然后,用 std::cout 输出数字。这个过程用不同的名字和数字完成了几次。

#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 总是在里面有相同的数字)。也许,我对 stringstreams 有一些不了解的地方...

尝试使用 Input StringStream std::istringstream,它专门用作输入流(如 std::cin),与 std::stringstream:

#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

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 and also the fail(if any) and eof flags with clear.[=18= 将 底层序列 (字符串流的内容)设置为空字符串]

这意味着,在你的 for 循环结束时你需要这个:SEE LIVE

int main()
{
   ....
   ....
   for (;;)
   {
      ...
      ...
      stream.str( std::string() );   // or stream.str(""); 
      stream.clear();
   }
   return 0;
}

问题是调用str(string)时读取位置未定义。 结果 stream 进入错误状态,here is a proof.

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

#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;
}

这里是proof that it works. In fact it is best to move more variables inside a loop