N - количество символов, но не глубина рекурсии. Если есть ошибка в алгоритме, например, он зацикливается, то переполнение стека произойдёт даже если под стек выделить всю память, включая дисковую и с рядом стоящего компьютера тоже.
Создай глобальную переменнную и увеличивай её значение при каждом входе в функцию str_cut и уменьшай значение при выходе (лучше сделай для этих целей класс, чтобы деструктор сам уменьшал значение). В момент падения посмотри значение, оно будет показывать реальную глубину рекурсии.
Типа такого код добавить надо:
int counter = 0;
class Counter
{
public:
Counter( int & c )
: counter(c)
{
++counter;
}
~Counter()
{
--counter;
}
int & counter;
};
str_cut()
{
Counter _(counter);
}