这是来自C ++程序的一段代码。
string TwoSeries::getArrays()
{
ostringstream outIndex;
ostringstream outValueA;
ostringstream outValueB;
string stA;
string stB;
string valueA;
string index;
int *arA;
int * arB;
string valueB;
for(int x = 0; x < 200; x++)
{
outIndex << x;
index = outIndex.str();
arA = getArrayA();
outValueA << *(arA + x);
valueA = outValueA.str();
arB = getArrayB();
outValueB << *(arB + x);
valueB = outValueB.str();
stA += index + ":" + valueA + " ";
stB += index + ":" + valueB + " ";
}
// return "Series A: \n"+stA+ "\n"+"Series B: \n"+ stB;
return index;
}
这个函数应该返回从int转换为字符串的最后一个索引,它应该是199.但是这个对象'outIndex'将所有数字(字符串)连接成一个字符串,并给出如下结果:1234567891011121314151617。 .. 198199.绝对最后一个数字是199.并且在完全循环后强制执行该功能的内容只输出最后一个数字,而不是它所遇到的所有数字。怎么做?
答案 0 :(得分:2)
您想要清除字符串流:
for(int x = 0; x < 200; x++)
{
outIndex.str("");
outValueA.str("");
outValueB.str("");
或者,您可以采用良好的C ++样式并在循环中本地声明它们:
for(int x = 0; x < 200; x++)
{
ostringstream outIndex;
ostringstream outValueA;
ostringstream outValueB;
当你在它时,你也可以移动其余部分。或者......重写如下:
string TwoSeries::getArrays()
{
string index;
int x;
for(x = 0; x < 200; x++)
{
ostringstream osA, osB;
osA << x << ":" << *(getArrayA() + x) + " ";
osB << x << ":" << *(getArrayB() + x) + " ";
string stA = osA.str(); // warning: value isn't used
string stB = osB.str(); // warning: value isn't used
}
ostringstream osA, osB;
outIndex << (x-1); // previous index
return outIndex.str();
}
请注意,您正在进行大量冗余工作,而且现在所有这些值都没有被使用。也许您有更多未显示的代码:)
答案 1 :(得分:1)
将循环中仅需要的对象移动到循环中。这导致它们在每次迭代时重置:
string TwoSeries::getArrays()
{
string stA;
string stB;
for(int x = 0; x < 200; x++)
{
ostringstream outIndex; //this stream used all three times.
outIndex << x;
string index = outIndex.str();
int *arA;
arA = getArrayA();
outIndex << *(arA + x);
string valueA = outIndex.str();
int * arB;
arB = getArrayB();
outIndex << *(arB + x);
string valueB = outIndex.str();
stA += index + ":" + valueA + " ";
stB += index + ":" + valueB + " ";
}
return "Series A: \n"+stA+ "\n"+"Series B: \n"+ stB;
}
您的问题是每次迭代都将索引添加到outIndex
,但从未重置它,导致它慢慢构建所有使用过的索引的列表。对于其他两个字符串流也会发生这种情况。 .str()
不清除流。
答案 2 :(得分:1)
for(int x = 0; x < 200; x++)
{
outIndex << x;
}
将x连续连接到outIndex。我认为您需要执行以下操作:
for(int x = 0; x < 200; x++)
{
outIndex << x;
....
outIndex.str("");
}
每次循环都会清除outIndex。