Пишу программу для реверса символов в предложении (с помощью рекурсивной функции, обязательно). При первом же входе в функцию VS начинает орать о перегрузке стека. Увеличил объем с 1мб до 4х для этого проекта - не помогает.
Вызвано исключение по адресу 0x011E5B89 в Project1.exe: 0xC00000FD: Stack overflow (параметры: 0x00000001, 0x01202FD4). Необработанное исключение по адресу 0x011E5B89 в Project1.exe: 0xC00000FD: Stack overflow (параметры: 0x00000001, 0x01202FD4).
#include <iostream>
#include <cstdlib>
#include <Windows.h>
using namespace std;
int textreverse(int fi, char rtext[10]);
int main()
{
SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода
SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода
int strln, i, si;
char refstring[10], resstring[10];
cout << "Введите предложение до 100 символов, где последний символ - точка:" << endl;
cin >> refstring;
strln = 0;
for (i = 0; i <= 10; i++) {
if (refstring[i] == '.') {
strln = i + 1;
break;
}
}
if (strln != 0) {
if (refstring[0] != '.') {
textreverse(0, refstring);
}
else {
cout << "Ошибка! Первый символ стоки - точка!" << endl;
}
}
else {
cout << "Ошибка! В строке нет точки!" << endl;
}
system("pause");
return 0;
}
int textreverse(int fi, char rtext[10])
{
if (rtext[fi] != '.') {
textreverse(fi++, rtext);
}
else {
cout << rtext[fi];
}
cout << endl;
return 0;
}
Дело не только в стеке. Смотрите:
char refstring[10], resstring[10];
cout << "Введите предложение до 100 символов, где последний символ - точка:" << endl;
cin >> refstring;
В refstring
у вас вносится одно слово, до пробела, а не строка, причем вы запрашиваете до 100 символов, а вносите в массив из 10 байт, так что слово в 10 символов уже вызовет проблемы.
Дальше у вас некорректно считается strln
- если точки нет (а ее скорее всего нет), это нуль.
Да и сама функция обращения строки вызывает сомнения в ее адекватности (хотя внимательно я ее не смотрел).
Я бы делал так:
void reverse(char * text, int first, int last)
{
if (first >= last) return;
char tmp = text[first];
text[first] = text[last];
text[last] = tmp;
reverse(text,first+1,last-1);
}
У вас в функции идет рекурсивный вызов
textreverse(fi++, rtext);
т.е. вы вызываете ее с тем же значением 0, что и остальные вызовы - ведь ++
у вас постфиксный! Вызывайте как
textreverse(fi+1, rtext);
Правда, и при этом работать она не станет, но бесконечной рекурсии не будет...
Но все указанные вначале ошибки исправьте тоже :)
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
Хочу получить результат, как, например, в Blender, в ортогональном режиме
У меня есть два QSettings в разных файлах, у одного все значения передаются в реестр, а другого - нет
Пытаюсь использовать паттерн MVCКак лучше организовать хранение модели и представления в контроллере? Вижу 2 варианта: