问题
我正在做一个实验任务,用户输入一个字符串,并且字符串中子字符串的起点和终点要反转。例如,如果用户输入字符串“go bobcats”、数字 3(用于开始索引)和 7(用于结束索引),则输出应该是“go accobts”。我可以编写一个递归函数来反转整个字符串(“go bobcats”变成“stacbob og”),但我遇到了子字符串的问题。
完整的字符串反转代码:
- void reversing(string s, int start, int end){
- if(s.size() == 0){return;}
- else{
- reversing(s.substr(1), start + 1, end);
- cout << s[0];
- }
- }
复制代码
对于它的开始和结束索引,我只输入了 0 和 9,因为这是字符串的全长。
如何调整函数,使其仅反转在用户输入的索引处开始和结束的字符串?此外,在当前函数中,我必须在 main 中使用 endl 在字符串输出的末尾创建一个新行。我可以在函数中执行此操作吗?如果我放一个 cout << s[0];在 endl 之后,它在每次迭代后放置一个新行,使输出垂直:
公司
t型
一
c类
第二
o型
第二
o型
公克
主要实现:
- string s;
- int start, end;
- cout << "Enter a string: ";
- while(cin.peek() == '\n' || cin.peek() == '\r'){
- cin.ignore();
- }
- getline(cin,s);
- cout << "Now enter two numbers that are within the bounds of the string. ";
- cin >> start >> end;
- cout << "This is how your words look now:\n";
- reversing(s,start,end);
- cout << endl;
复制代码
回答
反转字符串的函数交换范围两端的元素并在任一侧将范围缩小一个。
- void reversing(string& s, int start, int end) {
- if (start >= end)
- return;
- swap(s[start], s[end]);
- reversing(s, start + 1, end - 1);
- }
复制代码
然后进入 main() :
- // ...
- cout << "This is how your words look now:\n";
- reversing(s, start, end);
- cout << s << endl;
复制代码
|