2016-10-26 79 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"; 
相關問題