Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将字符串反转到位_C++ - Fatal编程技术网

C++ 将字符串反转到位

C++ 将字符串反转到位,c++,C++,我的代码怎么了?为什么它会不断比较,返回真值?不执行循环体没有?我试过GCC4.6和MSVC10SP1。由于某种奇怪的原因,循环中的cout语句没有被执行。循环体没有被执行,因为while行后面有一个分号,这导致循环体被忽略。因此,递增和递减语句没有被命中;couts也不是。首先,需要删除while语句后的分号 其次,您应该使用s.size-1初始化j,如果不是,则在您的示例中,它在开头1处指向一个无效索引,该索引位于字符串结尾之后。这可能会导致许多意外的结果。注意,在这种情况下,您必须检查s.

我的代码怎么了?为什么它会不断比较,返回真值?不执行循环体没有?我试过GCC4.6和MSVC10SP1。由于某种奇怪的原因,循环中的cout语句没有被执行。

循环体没有被执行,因为while行后面有一个分号,这导致循环体被忽略。因此,递增和递减语句没有被命中;couts也不是。首先,需要删除while语句后的分号

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


第三,如果您需要在生产代码中使用st std::reverse,您应该查看一下:

这可能与问题无关,但您希望将j初始化为s.size-1。最后一个有效索引总是比大小小一个。@Maxpm:我不确定,当代码运行时会发现,但它没有发现。谢谢你,哦,该死。是的。为什么没有针对此情况的警告:。谢谢因为空循环体不仅有效,有时还有用。@Ferruccio:请解释一下?当然,至少{}的存在不会损害这种有用性,也不会出现像我这样的情况?特别是在for循环的情况下,您可以在循环本身中做很多事情,所以有时候您不需要主体。就我的经验而言,像你这样的情况之所以存在,是因为程序员的责任。虽然我认为如果内存可用,可能会有一个GCC标志显示警告。从技术上讲,循环体不会被忽略。OP认为循环体实际上是一个不相关的块语句。aha,std::reverse。你在哪里回答这个问题:
#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;
}