перевернуть строку, используя символьные массивы и рекурсию, некоторая нить 1: ошибка EXC_BAD_ACCESS - PullRequest
2 голосов
/ 06 апреля 2020

Я пытаюсь перевернуть строку, используя символьные массивы и рекурсию, но я получаю «Поток 1: EXC_BAD_ACCESS (code = 2, address = 0x7ffeef3ffff8)», компилятор запрашивает около 7 входных данных, а затем начинает запрашивать команды, тогда как он должен запросить ввод один раз, а затем напечатать ответ на следующей строке. Программа работает нормально, когда я использую циклы, она начинает делать странные вещи, когда я использую рекурсию.

char* reverse(char ss[30], int l){
    char *p = new char;
    int c=0;
    if(c!=l+1){
        p[c]=ss[l-c-1];
        c++;
        reverse(ss, l);
    }
    return p;
} 

int main(int argc, const char * argv[]) {
    string s;
    cin>>s;
    char ss[30];
    for(int i=0; i<s.length(); i++){
        ss[i]=s[i];
    }
    char *answer;
    answer=reverse(ss, s.length());
    cout<<answer<<endl;
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

Мое мнение об использовании рекурсии - всегда лучше заменить на al oop

Вы устанавливаете тег C ++ - давайте используем std :: string

Этот метод с одним кодом wiv 2 - l oop и рекурсия

1) L oop - веселье c ReverseStr

2) Рекурсия - веселье c ReverseStrRecusrsion

  #include <iostream>
#include <string>


std::string ReverseStrRecusrsion(std::string s, std::size_t pos = 0) { 

    std::swap(s[pos], s[s.length() - pos - 1]);
    if (pos < s.length() /2) {
        s = ReverseStrRecusrsion(s, ++pos);
    }

    return s;
} 


std::string ReverseStr(std::string s) { 

    std::size_t size{s.length()}; 
    for (std::size_t i = 0; i < size / 2; i++) {
        std::swap(s[i], s[size - i - 1]); 
    }

    return s;
} 



int main() { 

    std::string str = "teststring";
    auto new_str{ReverseStr(str)}; 
    auto new_str2{ReverseStrRecusrsion(new_str)};

    std::cout << "old str " << str << std::endl;
    std::cout << "new str " << new_str << std::endl; 
    std::cout << "rev new str " << new_str2 << std::endl; 

    return 0; 
}
0 голосов
/ 06 апреля 2020

Итак, сначала мы читаем ввод от пользователя и сохраняем его в строке с именем s; мы получаем размер add и помещаем его в массив char (ведь массив char можно рассматривать как строку), дополнительный - только для символа '\ 0'. затем я передаю его в обратную функцию и затем распечатываю массив.

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

int main()
{
    string s;
    cin>>s;
    unsigned int StringSz = s.length();
    char arr[StringSz+1];
    arr[StringSz] = '\0';
    reverse(arr,s);
    cout << arr;
    return 0;
}

Теперь, как работает наша функция?

Мы передаем массив, строку и позицию, в которой мы находимся в данный момент. в, затем мы переключаем первый элемент с последним элементом, мы переключаем второй элемент с одним перед последним и делаем это, пока не достигнем конца строки.

void reverse(char* arr,string& s,int start=0)
{
    if(start==s.length())
        return;
    arr[start] = s[s.length()-start-1];
    reverse(arr,s,start+1);

}
...