0

这是来自 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。以及在完整循环后强制函数只输出最后一个数字而不是它遇到的所有数字。这该怎么做?

4

3 回答 3

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();
}

请注意,您正在做很多多余的工作,而现在所有这些值都没有被使用。也许您还有更多未显示的代码:)

于 2011-11-07T22:05:18.137 回答
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()清除流。

于 2011-11-07T22:06:32.393 回答
1
for(int x = 0; x < 200; x++)  
{         
    outIndex << x;
}

将不断地将 x 连接到 outIndex 上。我认为您需要执行以下操作:

for(int x = 0; x < 200; x++)  
{         
    outIndex << x;

    ....

    outIndex.str("");
}

这将在每次循环中清除 outIndex。

于 2011-11-07T22:10:06.653 回答