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