反向字符串函数在容纳 'space-bar' 时导致崩溃
Reverse string function causes crash when accommodating 'space-bar'
测试环境:Visual Studio2010
我试图将 'space-bar' 作为用户输入的一部分包含在内,以反转他们的字符串。到目前为止,我遇到了两个问题。
如果我只输入一个 word/character,程序就会崩溃。
如果我输入多个带空格的字符,第一个 character/word 会被跳过,其余的会打印,程序不会崩溃。
这是代码(我省略了部分代码,因为无论有没有给我带来问题的代码,它们都可以正常工作):
#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() 并且情况仍然相同。当我尝试调整函数的数字部分时,出现 WhosebugException。我感觉问题是 string firstLetr = inpu.substr(1,stored);
引起的...但我不知道该怎么做,也不知道去哪里找。
因此,我欢迎所有建议,如果可能的话,请尝试向我提示在函数中查看的位置,否则,如果您觉得提示会毫无意义,那么由您决定(但即使这是我仍然想尝试弄清楚)。
谢谢!
递归反转可以写的稍微简单一些
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;
}
substr
方法取一个位置并计数,所以 string firstLetr = inpu.substr(1,stored);
从位置 1 取一个可变长度的字符串,但看起来你想要一个单字母字符串,所以你的参数被交换了。有关详细信息,请参阅 http://en.cppreference.com/w/cpp/string/basic_string/substr。
这导致堆栈溢出的原因是您在每次递归调用时有效地增加了 inpu
字符串。
但是反转字符串根本不需要使用 substr
。将单个字母字符串存储为 string
既奇怪又过度。同样,多个字符串连接意味着您并没有真正在原地进行反转,而是在制作多个临时副本。
测试环境:Visual Studio2010
我试图将 'space-bar' 作为用户输入的一部分包含在内,以反转他们的字符串。到目前为止,我遇到了两个问题。
如果我只输入一个 word/character,程序就会崩溃。
如果我输入多个带空格的字符,第一个 character/word 会被跳过,其余的会打印,程序不会崩溃。
这是代码(我省略了部分代码,因为无论有没有给我带来问题的代码,它们都可以正常工作):
#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() 并且情况仍然相同。当我尝试调整函数的数字部分时,出现 WhosebugException。我感觉问题是 string firstLetr = inpu.substr(1,stored);
引起的...但我不知道该怎么做,也不知道去哪里找。
因此,我欢迎所有建议,如果可能的话,请尝试向我提示在函数中查看的位置,否则,如果您觉得提示会毫无意义,那么由您决定(但即使这是我仍然想尝试弄清楚)。
谢谢!
递归反转可以写的稍微简单一些
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;
}
substr
方法取一个位置并计数,所以 string firstLetr = inpu.substr(1,stored);
从位置 1 取一个可变长度的字符串,但看起来你想要一个单字母字符串,所以你的参数被交换了。有关详细信息,请参阅 http://en.cppreference.com/w/cpp/string/basic_string/substr。
这导致堆栈溢出的原因是您在每次递归调用时有效地增加了 inpu
字符串。
但是反转字符串根本不需要使用 substr
。将单个字母字符串存储为 string
既奇怪又过度。同样,多个字符串连接意味着您并没有真正在原地进行反转,而是在制作多个临时副本。