C ++ рекурсивно перевернуть строку и получить исключение: место чтения нарушения прав доступа - PullRequest
0 голосов
/ 30 апреля 2020

Я написал эту функцию для рекурсивного изменения строки:

ex-reverse. cpp

string reverse(string s, int n) {
  if (s.empty() == true)
    return s;

  int len = s.length();

  if (n <= len / 2) {
    return s;
  }
  swap(s[len - n], s[n - 1]);

  reverse(s, n - 1);
}

ex-main. cpp

void testReverse(string s) {
  string rev = reverse(s, s.length() - 1);
  cout << s << " | " << rev << endl;
}

int main() {
  string words[] = {"",       "a",      "aa",     "ab",     "aba",    "abc",
                    "abccba", "abcdba", "abcdea", "abcdef", "abcdefg"};
  int length = 11;

  cout << "REVERSE" << endl;
  for (int i = 0; i < length; i++) {
    testReverse(words[i]);
  }

  return 0;
}

при попытке отладки я получаю это. enter image description here

Я знаю, что это не что-то сложное, но кто-то может объяснить мне, почему я получаю это и, возможно, что будет хорошее решение справиться с этим?

1 Ответ

3 голосов
/ 30 апреля 2020

Вы всегда должны проверять, какие предупреждения показывает ваш компилятор.

В случае вашего кода должно отображаться сообщение, подобное этому (точное сообщение зависит от компилятора):

warning: non-void function does not return a value in all control paths [-Wreturn-type]

или

In function 'std::string reverse(std::string, int)':
warning: control reaches end of non-void function [-Wreturn-type]

Если ваш компилятор не показывает такое сообщение, тогда вы должны изменить настройки компилятора, чтобы повысить уровень предупреждения.

warning: control reaches end of non-void function говорит вам, что ваш код может выйти из функции (которая имеет тип возврата не void) без возвращая что-нибудь, и это приведет к неопределенному поведению, которое может быть чем угодно. В вашем случае cra sh, который является лучшим, в худшем случае ваше приложение просто начинает странно вести себя после этой точки.

Так что вам нужно изменить последнюю строку с reverse(s, n - 1); на return reverse(s, n - 1);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...