字符串反向,std :: string不允许字符赋值?

时间:2012-05-21 08:38:21

标签: c++ stdstring

这是我使用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不允许字符分配?

5 个答案:

答案 0 :(得分: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());

答案 1 :(得分: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

答案 2 :(得分:4)

因为output是空字符串output[i]将访问无效的内存位置。只需使用output将字符附加到output += input[j]字符串。

答案 3 :(得分:3)

尝试反向的STL算法?

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

答案 4 :(得分:1)

构建string output;后,它的长度为0。您需要将其大小调整为input.length()

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

调整大小比使用char附加char更快,但你必须首先知道大小。