Ошибка сегментации в рекурсивном алгоритме

Я пытаюсь написать рекурсивный алгоритм, который печатает все возможные комбинации представлений символов чисел с мобильного телефона. Как старые добрые телефоны; 2: ABC, 3: DEF и так далее.

Пример 23 должен напечатать AD, AE, AF, BD, BE, BF, CD, CE и CF. Я написал следующий алгоритм и верю, что он должен работать. Хотя не знаю, потому что ни один из моих компиляторов не дожидается завершения.

#include <iostream>
#include <string>
#include <cstring>

using namespace std;
static int totalNbr = 0;


void coolKey(string number, string result)
{
   totalNbr++;
   string keychar[] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};


int nbrSize = number.length(); 


if (nbrSize == 0)   // Basecase - We've reached 0 didgets
{
     cout << result << endl;    
     return;
}

else
{

    for (int i = 0; i < keychar[(number[0]-'0')].length(); i++)
    {

        result += keychar[(number[0]-'0')][i]; // Append char to result.
        number = number.erase(0,1);            // Remove  first didget of the number (eg. "234" becomse "34")
        coolKey(number,result);                // Call coolKey with the new variables.
    }

}

}


int main()
{

    coolKey("23", "");
    return 0;
}

Результат:

ad                                                                                                                                                                                         
Segmentation fault                                                                                                                                                                         

Я попытался найти ошибку, и, похоже, это какое-то переполнение стека или доступ к памяти только для чтения, но я не могу понять, где это происходит. Сначала я подумал, что это удаление строковых символов, но это не решило проблему.

Я был бы очень благодарен, если бы кто-нибудь мог мне здесь намекнуть :-)

С уважением, Бен


person Benjamin Larsen    schedule 28.02.2015    source источник
comment
Вы попали в переполнение стека из-за бесконечной рекурсии? Также result следует передавать в качестве ссылочного параметра.   -  person πάντα ῥεῖ    schedule 28.02.2015
comment
Это может вам помочь: Как отлаживать небольшие программы   -  person horns    schedule 28.02.2015


Ответы (1)


Очевидно, вы пытаетесь стереть первую цифру (number = number.erase(0,1);) для каждой возможной буквы, представленной цифрой.

Вы должны написать эту строку перед циклом for, а не внутри цикла. И даже до этого сохраните стираемую цифру, чтобы позже использовать ее в заголовке цикла.

person Gassa    schedule 28.02.2015