2012-05-21 41 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());