在循环中使用 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。
我目前正在练习使用 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。