Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
4 / 4 / 0
Регистрация: 12.05.2015
Сообщений: 38
1

Переворот строки рекурсией

13.05.2015, 11:19. Просмотров 4859. Ответов 11
Метки нет (Все метки)

Всем привет!
В книге Герберта Шилдта "C++ Шаг за шагом" глава: Рекурсии есть такой пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//Переворот строки рекурсией
#include <iostream>
 
using namespace std;
 
char reverse(char *p);
 
int main()
{
    setlocale(LC_ALL, "Russian");
    char str[] = "Это просто проверка!";
 
    cout << "Начальная строка: " << str << "\n";
    cout << "Перевернутая строка: ";
    cout << reverse(str);
    cout << "\n";
    system("Pause");
}
 
char reverse(char *p)
{
    if (*p)
        reverse(p + 1);
    else return;
 
    cout << *p;
}
Все работает правильно и с тем, как работает рекурсия разобрался(мозг по швам пошел )
Меня интересует только один момент, при выводе перевернутой строки после буквы "Э" выводится непонятный символ:

Начальная строка: Это просто проверка!
Перевернутая строка: !акреворп отсорп отЭ° <--Вот этот парень
Для продолжения нажмите любую клавишу . . .

Покликавши дебагер, так и не смог разобраться, заранее признателен за помощь!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.05.2015, 11:19
Ответы с готовыми решениями:

Переворот строки
Реализуйте класс ReversibleString, хранящий строку и поддерживающий методы Reverse для переворота...

Переворот строки
Добрый вечер. Нужно перевернуть строку 12345 в 54321. Подскажите, где неверно в коде. Если можно...

Переворот строки
Ребят,у меня есть 2 часа чтоб понять!УМОЛЯЮ, помогите...объясните в этой функции( которая...

Переворот строки
Почему при использовании указателя ошибка, а при использование массива всё нормально? void...

11
zzzZZZ...
523 / 354 / 94
Регистрация: 11.09.2013
Сообщений: 2,040
13.05.2015, 11:52 2
у размер строки == символ + 1 (символ конца строки) когда переворачиваемчитается строка, начало съезжает на 1 позицию и читается мусор, т.е. то что по идее до p[0]
1
4 / 4 / 0
Регистрация: 12.05.2015
Сообщений: 38
13.05.2015, 11:53  [ТС] 3
То есть это выводится p[-1](разумеется которого не существует, просто привёл для наглядности)?
0
zzzZZZ...
523 / 354 / 94
Регистрация: 11.09.2013
Сообщений: 2,040
13.05.2015, 12:03 4
Цитата Сообщение от ultradox Посмотреть сообщение
То есть это выводится p[-1](разумеется которого не существует, просто привёл для наглядности)?
хм...мб я не прав, дайте подумать)

Добавлено через 9 минут
блин а хрен его знает, так не должно быть
1
5 / 5 / 4
Регистрация: 16.10.2014
Сообщений: 19
13.05.2015, 12:43 5
У меня этот код отлично работает.
Но в необходимо указать возвращаемое значение.
Цитата Сообщение от ultradox Посмотреть сообщение
char reverse(char *p)
{
* * if (*p)
* * * * reverse(p + 1);
* * else return;
cout << *p;
}
1
4 / 4 / 0
Регистрация: 12.05.2015
Сообщений: 38
14.05.2015, 11:43  [ТС] 6
У меня в двух компиляторах возвращает в конце мусор, в VS и Code blocks. Ставил return 0 или return 1. Сейчас попробую на другом компьютере :-)
А на телефоне через программу cppdroid вообще не компилируется ни с какими значениями return, говорит:
Return code is not 0. Хотя везде нули поставил.

Добавлено через 22 часа 37 минут
К сожалению не удалось проверить на другом компьютере, надо переустанавливать компоненты Visual. тема открыта, сделал построчный анализ в дебагере, может я чего-то не понимаю, но у меня такое ощущение, что return 0 из reverse забрасывает туда мусор.

Добавлено через 26 секунд
отпишитесь, есть ли такая проблема у кого-то кроме меня?
0
1378 / 405 / 144
Регистрация: 22.10.2014
Сообщений: 872
14.05.2015, 12:08 7
C++
1
cout << reverse(str);
Эта строчка после сообщения выводит возвращаемое значение, которое - неинициализированный мусор.
C++
1
2
3
    cout << "Перевернутая строка: ";
    reverse(str);
    cout << "\n";
1
3269 / 2657 / 717
Регистрация: 25.03.2012
Сообщений: 9,582
Записей в блоге: 1
14.05.2015, 12:14 8
ultradox, а зачем эта функция вообще что-то возвращает?
1
5 / 5 / 4
Регистрация: 16.10.2014
Сообщений: 19
14.05.2015, 12:20 9
Лучший ответ Сообщение было отмечено ultradox как решение

Решение

Я думаю функция возвращает адрес указателя "p".
Ведь она должна что то возвращать, т.к. указан тип возвращаемого значения char*
а здесь
C++
1
2
3
4
5
if (*p)
        reverse(p + 1);
    else return;
 
    cout << *p;
возврат идет только когда условие if не выполняется.
1
4 / 4 / 0
Регистрация: 12.05.2015
Сообщений: 38
14.05.2015, 12:20  [ТС] 10
Потому что этого требуют компиляторы и она не void, а все функции кроме void должны чего-то возвращать. Или я не прав?
0
5 / 5 / 4
Регистрация: 16.10.2014
Сообщений: 19
14.05.2015, 12:23 11
Лучший ответ Сообщение было отмечено ultradox как решение

Решение

Попробуй так:
Цитата Сообщение от ultradox Посмотреть сообщение
char reverse(char *p)
{
* * if (*p)
* * * * reverse(p + 1);
* * else return 0;
cout << *p;
return 0;
}
1
4 / 4 / 0
Регистрация: 12.05.2015
Сообщений: 38
14.05.2015, 12:58  [ТС] 12
NKS74, Спасибо, помогло буду сейчас пошагово разбирать !


Добавлено через 1 минуту
Все понял, программа не натыкаясь на return в конце программы делала один "лишний" цикл с мусором вместо значения. Отсюда он и взялся.
Кстати, попробовал вообще без else, и первого return тоже работает.
C++
1
2
3
4
5
6
7
8
char reverse(char *p)
{
    if (*p)
        reverse(p + 1);
 
    cout << *p;
    return 0;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.05.2015, 12:58

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Выборочный переворот строки
Доброго дня! Хочу написать программу, которая на входных данных получает строку, в которой фраза с...

Переворот строки. Необработанное исключение. Нарушения прав доступа
void turn(char c, int step, int size) { if(step &lt; size&gt;&gt;1) { char temp = c; ...

Переворот строки, не используя временные переменные и не осуществляя полного прохода по всей строке
У вас есть переменная std::string str = &quot;abcdefghijklmop&quot;;Напишите код переворота строки, не...

Переворот строки
Удивительно, но в поиске такого не нашел... В общем, нужно создать метод переворота заданной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.