2016-10-26 45 views
0

我想写一个程序来反转一个字符串。我使用了下面的代码,但不幸的是它没有工作。我有点困惑,为什么发生。我可以将单个字符分配给C++中的字符串吗?

这里是我的代码:

#include <string> 
#include <iostream> 
using namespace std; 

int main() 
{ 
    string InputString = "Hello"; 
    string OutputString; 
    int length; 

    length = InputString.length(); 

    for (int i=length-1, j=0; i >=0, j<length; i--, j++) 
     OutputString[j] = InputString[i]; 

    cout << "The reverse string of " << InputString << " is " 
     << OutputString << ".\n"; 

    return 0; 
} 

我的输出是: 你好的反向字符串。

+1

OutputString [J]? – HazemGomaa

+1

我也*强烈*推荐编写'const int length = InputString.length();'尽可能经常使用'const'习惯。它使很多错误更容易看到,编译器可以喜欢它进行优化。 –

+0

最后,'length_t'用于'length','i'和j'是一个很好的习惯。容器倾向于使用'size_t'作为其长度和索引变量。如果您遵循相同的风格,从长远来看,它可以节省很多麻烦。 –

回答

7

这个问题并不完全是你认为的。这是OutputString和任何索引到它将超出界限并导致未定义的行为

你可能反而做这样的事情

OutputString += InputString[i]; 

字符追加到字符串。

此外,循环条件i >=0, j<length也不会像你想象的那样工作。您正在使用逗号表达式,因此虽然i >= 0j<length都将被评估,但只会使用j<length的结果。您可能想要使用逻辑和运算符:i >=0 && j<length

+0

非常感谢! – Eugenie

+0

我认为'j = 0'相同 - 所以任何一个条件都是好的,评估这两个条件都没有害处(即只会损害程序员的大脑) – anatolyg

+2

您也可以在循环之前执行'OutputString.resize(length);'然后保留原始循环 –

0

我宁愿扭转这样的字符串:

#include <string> 
#include <iostream> 

int main(int argc,char** argv){ 

    std::string hello = "hello"; 

    for(std::size_t i=0;i < hello.length()/2; ++i) 
    { 
     std::swap(hello[i],hello[hello.length()-i-1]); 
    } 

    std::cout<<hello<<std::endl; 

return 0; 
} 

Live Demo

+1

*真的*?我更喜欢使用'std :: reverse'我自己 - 但那不是OP在询问什么。他显然正在学习C++的基础知识。 –

+0

我的意思是以这种方式扭转字符串是我被教导的另一种方法,即使用OP所使用的方法进行反转。我完全忘了'std :: reverse',感谢提醒。 –

0

,或者你只是做:

string OutputString(InputString.rbegin(), InputString.rend()); 
cout << "The reverse string of " << InputString << " is " 
     << OutputString << ".\n"; 
相关问题