将弦转换到位

时间:2011-07-10 13:03:11

标签: c++

#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
bool compare( const string::size_type i, const string::size_type j )
{
    cout << "comparing " << i << " and " << j << "." << endl;
    return i < j;
}

void reverse_inplace( std::string &s )
{
    std::string::size_type i = 0;
    std::string::size_type j = s.size()-1;
    cout << "called" << endl;
    while( compare(i,j) );
    {
        cout << i << " " << j << endl;
        std::swap(s[i], s[j]);
        ++i;
        --j;
        cout << i << " " << j << endl;
    }
}

int main()
{
    string s( "a" );
    reverse_inplace(s);
    cout << s << endl;
}

我的代码出了什么问题?为什么要继续比较,回归真实?并没有执行循环体没有?我试过GCC 4.6和MSVC 10 SP1。由于某些奇怪的原因,循环中的cout语句没有被执行。

2 个答案:

答案 0 :(得分:9)

循环体未被执行,因为在while()行之后有分号,这导致循环体被忽略。因此,增量和减量语句没有被击中;它们都不是cout

答案 1 :(得分:3)

首先,您需要在while语句后删除分号。

其次,您应该使用j初始化s.size()-1,否则,它会指向开头的无效索引(1,在字符串结尾之后) )。这可能会导致许多意外结果。请注意,在这种情况下,您必须检查s.size()==0,因为size_t是无符号的,s.size()-1会为空字符串提供下溢。

第三,如果你需要在生产代码中使用它,你应该看看st std::reverse():)