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

时间:2018-06-10 04:52:30

标签: c++ for-loop stringstream

我目前正在练习使用stringstreams从字符串中提取值。在这个简单的代码中,用户输入一个名称和一个数字(用空格分隔),这个字符串存储在"输入"中。然后,它传递给" stream"它将名称和数字分开,这些名称和数字存储在" name"和"数字"。然后,使用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;
}

问题:只有第一个输入的输入的数字存储在&#34;金额&#34;中。下一个输入的数量不会存储在&#34;金额&#34; (金额内总是有相同的数字)。也许,我不了解串流......

3 个答案:

答案 0 :(得分:1)

尝试使用输入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;
}
  

输入:Hello 3.14

     

输出:3.14

     

输入:World 2.71

     

输出:2.71

答案 1 :(得分:1)

  

问题:仅存储第一个输入输入的编号   “量”。下一个输入的数量将不会被存储   “金额”(金额内部始终具有相同的数字)。也许,有   关于stringstreams我不知道的事情......

是。您在使用一次后忘记重置 std::stringstream

为了做到这一点,你需要使用std::stringstream::str底层序列(字符串流的内容)设置为空字符串,并且 fail (如果有)和 eof标志 clear

这意味着,您需要结束for循环: SEE LIVE

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

答案 2 :(得分:1)

问题是在调用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。事实上,最好移动more variables inside a loop