我目前正在练习使用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; (金额内总是有相同的数字)。也许,我不了解串流......
答案 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。