测试环境:Visual Studio 2010
我正在尝试包含空格键'作为用户输入的一部分,用于反转其字符串。到目前为止,我遇到了两个问题。
如果我只输入一个单词/字符,程序就会崩溃。
如果我输入带空格的多个字符,则跳过第一个字符/单词,其余打印,程序不会崩溃。
以下是代码(我已经省略了部分代码,因为它们可以正常使用或不使用代码片段给我提出问题):
#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);
引起了这个问题...但我不知道该做什么或在哪里看。
所以我欢迎所有的建议,如果可能的话请尽量向我暗示在哪里看一下这个函数,否则如果你觉得这个暗示会是一个死的赠品然后由你决定(但即使它是我仍然想尝试弄清楚)。
谢谢!
答案 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
既奇怪又过分。同样,多个字符串连接意味着您并没有真正进行逆转,并且您正在制作多个临时副本。