当容纳空格键时,反向弦功能会导致崩溃。

时间:2015-02-21 02:03:55

标签: c++ string reverse

测试环境:Visual Studio 2010

我正在尝试包含空格键'作为用户输入的一部分,用于反转其字符串。到目前为止,我遇到了两个问题。

  1. 如果我只输入一个单词/字符,程序就会崩溃。

  2. 如果我输入带空格的多个字符,则跳过第一个字符/单词,其余打印,程序不会崩溃。


  3. 以下是代码(我已经省略了部分代码,因为它们可以正常使用或不使用代码片段给我提出问题):

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    void RevStrng(string &inpu, int &entry) 
    {
        if (entry == inpu.size()-1) //return the length of the string, minus 1 byte
            return;
        int stored = inpu.size() - 1 - entry; //store the rearranged string in variable stored
        string firstLetr = inpu.substr(1,stored); //starting character for rearrangement
        string restOfLetr = inpu.substr(stored+1,inpu.size()); //remaining characters for rearrangement
        inpu = firstLetr + inpu.substr(0,1) + restOfLetr; //store rearrangement in pointer inpu
        RevStrng(inpu,++entry); //print rearranged string until 0 bytes left
    
    };
    int main()
    {
    
    ...
    ...
    ...
    
        //Taking user input, and printing it backwards
        cout << "///Display string Backwards///" << endl;
        string sentnce; 
        int syze = 0;
        cout<<"Please enter characters to be read backwards: ";
        cin>>(sentnce);
        getline(cin, sentnce);
        RevStrng(sentnce, syze);
        cout << "Your entry backwards is: "<< sentnce << "\n" << endl;
    
    ...
    ...
    ...
    }
    

    我无法弄清楚我做错了什么。我知道他们做了同样的事情,但我甚至尝试将.length()更改为.size()并且仍然是相同的情况。当我尝试调整函数的数字部分时,我得到一个StackOverFlowException。我感觉string firstLetr = inpu.substr(1,stored);引起了这个问题...但我不知道该做什么或在哪里看。

    所以我欢迎所有的建议,如果可能的话请尽量向我暗示在哪里看一下这个函数,否则如果你觉得这个暗示会是一个死的赠品然后由你决定(但即使它是我仍然想尝试弄清楚)。

    谢谢!

2 个答案:

答案 0 :(得分:2)

递归反转可以写得稍微简单。

std::string reverse(std::string s)
{
   return s.empty() ? s : reverse(s.substr(1)) + s[0];
}

或就地

void reverse(std::string& s, int a, int o)
{
   if (a < o)
   {
      std::swap(s[a], s[o]);
      reverse(s, a + 1, o - 1);
   }
}

编辑:

如果您使用std::reverse,则不需要自己的功能。

一个完整的例子:

int main()
{
    cout << "///Display string Backwards///" << endl;
    string sentence; 
    cout << "Please enter characters to be read backwards: ";
    getline(cin, sentence);
    reverse(sentence.begin(), sentence.end());
    cout << "Your entry backwards is: "<< sentence << "\n" << endl;
}

答案 1 :(得分:1)

substr方法采用位置和计数,因此string firstLetr = inpu.substr(1,stored);从位置1获取可变长度字符串,但看起来您想要一个单字母字符串,因此您的参数将被交换。有关详细信息,请参阅http://en.cppreference.com/w/cpp/string/basic_string/substr

这导致堆栈溢出的原因是你在每次递归调用时都在有效地增长inpu字符串。

但是,反转字符串不需要使用substr。将单个字母字符串存储为string既奇怪又过分。同样,多个字符串连接意味着您并没有真正进行逆转,并且您正在制作多个临时副本。