我正在尝试通过ostringstream将int转换为字符串,但每次将数据放入流中时,它都会保留在流中。我已尝试同时使用.flush()
和<<endl
,但该流不会清空。 This question表明我并没有真正得到溪流(我没有,仍在努力),而我正在做的事情是笨蛋和不必要的。
int main()
{
long int max = 0;
ostringstream strs;
for(int i=10;i<100; i++){
for(int j = i; j < 100; j++){
long int product = i*j;
strs.flush();
strs <<product;
string str = strs.str();
cout<<str;
int size = str.length();
}
}
cout<<max;
return 0;
}
目前我得到
的输出100/100
110/100110
120/100110120
130/100110120130
etc...
而不是
100/100
110/110
120/120
130/130
etc...
答案 0 :(得分:3)
std::ostringstream
是字符串的编写器接口。使用<<
附加到字符串,flush
是多余的,因为字符串没有缓冲区。
要更改流写入的字符串(例如更改为空字符串),请使用其str()
成员函数的设置版本:
strs << product;
string str = strs.str();
strs.str(""); // reset string written into
答案 1 :(得分:1)
到目前为止,处理此问题的最简单方法是每次希望它为空时创建一个新的stringstream
对象。在大多数情况下(包括你的),只需让现有对象超出范围,并在重新输入正确范围时创建一个新对象,就可以轻松处理。
就个人而言,我会通过将所有代码从int
转换为std::string
到具有本地stringstream对象的函数来完成这项工作,因此每次都会创建一个“干净”的字符串流你调用这个函数,并在你离开它时被销毁。
std::string to_string(long int in) {
std::stringstream buffer; // New/empty every time this function is called
buffer << in;
return buffer.str();
} // here buffer goes out of scope and is destroyed.
int main()
{
long int max = 0;
for(int i=10;i<100; i++){
for(int j = i; j < 100; j++) {
long int product = static_cast<long>(i)*j;
std::string str = to_string(product);
// presumably:
// if (product > max) max = product;
std::cout << str;
// you never seem to use this:
//int size = str.length();
}
}
cout<<max;
return 0;
}
一些注意事项:如果你的编译器是最新的,它的标准库中可能已经有std::to_string
,所以你可以使用它而不是自己编写。
在将long
和i
相乘之前,请注意投降到j
。鉴于您目前正在使用的值,这不是绝对必要的,但long
对product
的使用也不是必需的。假设您可能使用product
可能比int
更大的值,则必须使用强制转换。如果没有它,你就会在两个int
上进行乘法,这自然会产生int
个结果。 然后你正在接受这个结果(如果它太大而无法容纳int
)并且将其转换为long,那么结果已经溢出。通过在乘法之前将其中一个操作数转换为long
,您可以强制在long
s上执行乘法,防止溢出(至少假设long
足够大到保持结果)。
答案 2 :(得分:0)
清除ostringstream.buffer:
strs.str("");
答案 3 :(得分:0)
要重置std::ostringstream
,只需指定一个新缓冲区:
std::ostringstream oss;
// ...
oss.str(std::string());
但是,大多数时候没有必要,因为你可以在最窄的范围内定义/初始化你的字符串流,以便自动获得。在您的情况下,您可能希望在外部for循环中定义它。
答案 4 :(得分:0)
将ostringstream放入范围,以便每次输入时都会重新创建。在你的情况下,它将是:
int main()
{
long int max = 0;
{
ostringstream strs;
for(int i=10;i<100; i++){
for(int j = i; j < 100; j++){
long int product = i*j;
strs.flush();
strs <<product;
string str = strs.str();
cout<<str;
int size = str.length();
}
}
}
cout<<max;
return 0;
}