2012-05-21 39 views
0

這是我使用std::string來反轉字符串的代碼。但它不工作..字符串反轉,std :: string不允許字符賦值?

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

main() 
{ 
    string input; 
    int i, j; 
    cout << "Enter a string: "; 
    getline(cin,input); 

    string output; 
    for(i = 0, j = input.length() - 1; i < input.length(); i++, j--) 
     output[i]=input[j]; 

    cout << "Reversed string = " << output; 
    cin.get(); 
} 

但是,如果我們替換字符串輸出char output[100];它的工作原理。那麼std::string不允許字符分配?

+1

您應該爲'output'分配內存。 – demi

+4

誰低估了這一點太過懦弱而不能發表評論,所以只是指出一些這個問題可能會得不償失的問題:你沒有努力正確地設計你的代碼。您的代碼無效C++開始。您的代碼不會降到最低限度以重現問題。 –

回答

5

你必須調整輸出:

output.resize(input.length()); 

或初始設置長度:

string output(input.length(), ' '); 

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

main(){ 
string input; 
int i,j; 
cout << "Enter a string: "; 
getline(cin,input); 
string output(input.length(), ' '); // initially set sufficient length 
for(i=0,j=input.length()-1;i<input.length();i++,j--) 
output[i]=input[j]; 

cout << "Reversed string = " << output; 
cin.get(); 
} 

參見: std::string

+0

std :: string構造函數中的第二個參數是什麼?爲什麼它是一個空白的字符? :) – Xegara

+0

這是填充字符串的字符。 std :: string(n,c)給出字符串c n次。 – Ruben

4

因爲output是一個空字符串output[i]將訪問無效的內存位置。只需使用output += input[j]將字符附加到output字符串即可。

1

構建string output;它有0長度。您需要將其調整爲input.length()

string output; 
output.resize(input.length()); 

調整大小的速度比通過字符附加char要快,但您必須首先知道大小。

10

std::string允許字符分配表,但無法超越的結束串。由於std::string output;創建了一個空字符串,因此output[0]超出了字符串的末尾。

想必這是一個學習的運動,但你不妨也瞭解一些工具,會爲你做它:

#include <string> 
#include <iostream> 
#include <algorithm> 

int main() { 
    std::string input; 
    std::getline(cin,input); 
    std::cout << "input: " << input << '\n'; 

    std::reverse(input.begin(), input.end()); 
    std::cout << "reversed: " << input << '\n'; 
} 

或:

#include <iterator> 
... 

    std::string output; 
    std::reverse_copy(input.begin(), input.end(), std::back_inserter(output)); 
    std::cout << "reversed: " << output << '\n'; 

或:

std::string output; 
    std::copy(input.rbegin(), input.rend(), std::back_inserter(output)); 

或者:

std::string output(input.rbegin(), input.rend()); 
3

試試反向的STL算法?

include <algorithm> 
// ... 
std::string str("hello world!"); 
std::reverse(str.begin(), str.end());