字符串mash(递归)C ++

时间:2016-10-30 15:00:50

标签: c++

我有一项任务要求我执行以下任务: “让一个用户输入一个字符串。然后显示这个字符串,如下所示:显示字符串中的第一个字符,然后显示最后一个字符,然后显示第二个字符,然后显示第二个字符到最后一个字符,然后显示第三个字符...所以如果字符串是“abcdef”,它会显示: afbecd(输入“abcdef”)“ 这是我的方法,但它没有运行。我收到了分段错误11。

#include <iostream>
#include <cmath>
using namespace std;

void printLetters(string s);

int main()
{
  string sequence;
  cout << "Enter a sequence: ";
  getline(cin, sequence);
  printLetters(sequence);
}

void printLetters(string s)
{
  int a = floor(s.length()/2.0);
  // stopping case
  if(s == "")
  {
    return;
  }

  // reduce problem
  printLetters(s.substr(0)); 
  //cout << s[0];
  cout << s[a];
}

这是一个例子:12345。在我的函数printLetters(string s)中,我打印出从索引0开始的字符串,然后我有完整的字符串12345.然后,我在索引s.length“cout”内容()/ 2,这是中间字符“3”。然后回到字符串并继续打印从索引0开始的子字符串,但这次是1245.我不断重复这些步骤,直到我得到1.在讲座中,我的教授解释了递归到达结束时过程中,它将从底部返回到顶部。然后当我达到1时,它会回到5,2,3,4。所以我假设我会打印出字符串“15234”,但我没有。如果您有任何想法,我会很乐意倾听。非常感谢!

这是另一个用于反转字符串的代码。我的教授在课堂上解释说,这就是他在代码背后给出的逻辑。

  #include <iostream>
  using namespace std;
  void printString(string s);
  int main()
  {
    printString("hello");  
    return 0;
  }
  void printString(string s)
  {
      if(s == "")
      {
        return;
      }   
      printString(s.substr(1));
      cout << s[0];
  }

1 个答案:

答案 0 :(得分:-1)

试试这个

#include <iostream>
#include <string>
using namespace std;

void printLetters(string s);

int main()
{
string sequence;
cout << "Enter a sequence: ";
getline(cin, sequence);
printLetters(sequence);
cout << endl;
system("pause");
}

void printLetters(string s)
{
int a =s.length();
if (a == 0)
{
    return;
}
cout << s[0];
if(a>1)
cout<< s[a - 1];
s.erase(0, 1);
a = s.length();
if(a>1)
s.erase(a-1);
printLetters(s);
}

非常感谢你。它完美地运作。你认为我们需要系统(“暂停”)吗?因为我没有在代码中包含它,它仍然运行。我完全理解你的代码背后的逻辑。非常感谢。