Форум программистов, компьютерный форум CyberForum.ru

Подскажите в чем ошибка в моей программе (рекурсия) - C++

Восстановить пароль Регистрация
 
Nikko12
 Аватар для Nikko12
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 162
22.08.2013, 18:24     Подскажите в чем ошибка в моей программе (рекурсия) #1
Программа копирует строку t в конец строки s: вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<iostream>
using namespace std;
int i=0;
string fn_strcat(string s,string t)
{
    char *p=&t[i];//создаем указатель "р", изначально на нулевой элемент строки t
    while(*p!='\0')// пока не дойдем до конца строки
    {
        s=s+*p++;//сначало к строке s прибавляем p и потом увеличиваем р
        ++i;
        fn_strcat(s,t);//рекурсия
    }
    return (s);
}
int main()
{
    string s,t;
    cin>>s>>t;
    cout<<fn_strcat(s,t);
}
P.S. Заранее спасибо за ответ.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.08.2013, 18:24     Подскажите в чем ошибка в моей программе (рекурсия)
Посмотрите здесь:

C++ Подскажите в чем ошибка (С++)
C++ Подскажите в чем ошибка
C++ Подскажите в чем ошибка
Подскажите в чем ошибка C++
C++ Подскажите, в чем ошибка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
22.08.2013, 18:29     Подскажите в чем ошибка в моей программе (рекурсия) #2
Цитата Сообщение от Nikko12 Посмотреть сообщение
Подскажите в чем ошибка
В понимании того что такое объекты в первую очередь.
Цитата Сообщение от Nikko12 Посмотреть сообщение
Программа копирует строку t в конец строки s: вот код:
C++
1
cout<<(s+=t);
Nikko12
 Аватар для Nikko12
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 162
22.08.2013, 18:33  [ТС]     Подскажите в чем ошибка в моей программе (рекурсия) #3
Цитата Сообщение от Croessmah Посмотреть сообщение
Сообщение от Nikko12
Подскажите в чем ошибка
В понимании того что такое объекты в первую очередь.
Не совсем понял, можно конкретнее??

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
Код C++
C++
1
cout<<(s+=t);
Не совсем понял, куда это вставить.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
22.08.2013, 18:36     Подскажите в чем ошибка в моей программе (рекурсия) #4
Цитата Сообщение от Nikko12 Посмотреть сообщение
Не совсем понял, можно конкретнее??
ты ерунду какую-то написал. String в твоём примере стандартный? Если да, зачем вообще какие-то функции для него писать?
Ну и как следствие, в теле функции лютый бред
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
22.08.2013, 18:36     Подскажите в чем ошибка в моей программе (рекурсия) #5
Цитата Сообщение от Nikko12 Посмотреть сообщение
Не совсем понял, куда это вставить.
C++
1
2
3
4
5
6
7
8
9
10
#include<iostream>
#include <string>
 
using namespace std ;
 
int main ( ) {
    string s,t;
    cin>>s>>t;  
    cout<<(s+=t);
}
Nikko12
 Аватар для Nikko12
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 162
22.08.2013, 18:54  [ТС]     Подскажите в чем ошибка в моей программе (рекурсия) #6
Croessmah, Я хотел реализовать присоединение строк с помощью указателей и рекурсивно.

Добавлено через 42 секунды
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
ты ерунду какую-то написал. String в твоём примере стандартный?
Что значит "стандартный"??

Добавлено через 56 секунд
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Ну и как следствие, в теле функции лютый бред
Можно Ваш вариант, не бредовый?
no_wearines
 Аватар для no_wearines
52 / 48 / 2
Регистрация: 01.01.2012
Сообщений: 322
22.08.2013, 19:01     Подскажите в чем ошибка в моей программе (рекурсия) #7
Вот вам вариант не бредовый:
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
#include <iostream>
#include <cstring>
#include <conio.h>
using namespace std;
 
void f1(char *array1, char *ptr1) {
 
if(!*ptr1) { *array1 = '\0'; return; }
 
*array1++ = *ptr1++;
 
f1(array1, ptr1);
}
 
 
int main() {
char array1[20] = "Hello ", *ptr1 = "world";
 
 
f1(array1 + strlen(array1), ptr1);
 
cout<<array1;
 
getch();
return 0;
}
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
22.08.2013, 19:03     Подскажите в чем ошибка в моей программе (рекурсия) #8
Цитата Сообщение от Nikko12 Посмотреть сообщение
Можно Ваш вариант, не бредовый?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
char* fn_strcat(char* dst, const char* src){
    while(*dst++);
    while(*dst++=*src++);
    return dst;
}
int main(){
    char s1[20]="Hello ";
    fn_strcat(s1, "world");
    cout<<s1;
    return 0;
}
no_wearines
 Аватар для no_wearines
52 / 48 / 2
Регистрация: 01.01.2012
Сообщений: 322
22.08.2013, 19:05     Подскажите в чем ошибка в моей программе (рекурсия) #9
Kuzia domovenok. Человечек же рекурсию просил.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
22.08.2013, 19:16     Подскажите в чем ошибка в моей программе (рекурсия) #10
еловечек же рекурсию просил
а на кой тут рекурсия? вот тут проще рукурсией, а тут(в этой теме) проще циклом, как и написал Кузя
no_wearines
 Аватар для no_wearines
52 / 48 / 2
Регистрация: 01.01.2012
Сообщений: 322
22.08.2013, 19:24     Подскажите в чем ошибка в моей программе (рекурсия) #11
причем тут проще или не проще. Человек изучает тему рекурсии.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
22.08.2013, 20:18     Подскажите в чем ошибка в моей программе (рекурсия) #12
Цитата Сообщение от no_wearines Посмотреть сообщение
Человек изучает тему рекурсии.
можно изучать тему структур данных сортируя стеки, вот это тоже самое
Nikko12
 Аватар для Nikko12
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 162
22.08.2013, 23:47  [ТС]     Подскажите в чем ошибка в моей программе (рекурсия) #13
no_wearines, Спасибо
Jupiter, Если уж помогаете, так помогайте по теме, или вообще лучше не помогайте.

Добавлено через 1 минуту
P.S. Что нужно исправить в моей программе, что бы она не завершалась с ошибкой?

Добавлено через 56 секунд
P.S.S. Мне не нужен другой код с использование указателей и рекурсией, меня интересует ошибка в моей программе.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.08.2013, 03:07     Подскажите в чем ошибка в моей программе (рекурсия) #14
Цитата Сообщение от Nikko12 Посмотреть сообщение
меня интересует ошибка в моей программе.
Их много.
При последнем заходе в функцию, здесь будет выход за границу строки:
C++
1
char *p=&t[i];//создаем указатель "р", изначально на нулевой элемент строки t
При чтении в string, cin >> не добавляет '\0', поэтому такая проверка не сработает:
C++
1
while(*p!='\0')// пока не дойдем до конца строки
Цикл while() здесь не нужен, рекурсия сама по себе цикл.
Не нужно передавать в функцию копии строк, и не нужно возвращать из функции копию строки, иначе, при выходе из рекурсии, строка начнёт уменьшаться.
Если так переписать, то будет работать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int i = 0;
void fn_strcat(string &s, string &t)
{
    if (i == t.size()) return; // пока не дойдем до конца строки
    char *p = &t[i]; //создаем указатель "р", изначально на нулевой элемент строки t
    s = s + *p++; //сначало к строке s прибавляем p и потом увеличиваем р
    ++i;
    fn_strcat(s, t); //рекурсия
 }
 
int main()
{
    string s, t;
    cin >> s >> t;
    fn_strcat(s, t);
    cout << s << endl;
 
    return 0;
}
Nikko12
 Аватар для Nikko12
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 162
23.08.2013, 07:29  [ТС]     Подскажите в чем ошибка в моей программе (рекурсия) #15
Цитата Сообщение от alsav22 Посмотреть сообщение
При чтении в string, cin >> не добавляет '\0', поэтому такая проверка не сработает:
Код C++
1
while(*p!='\0')// пока не дойдем до конца строки
Если cin >> не добавляет '\0', в конец строку, то как тогда он узнает, где она заканчитвается??
P.S. Код вполне отлино работал если его переделать без функций т.е. рекурсию заменить на goto и все перенести в main(). Почему он сейчас не хочет работать? Ведь нечего не менялось кардинально?
P.S.S. За ответ большое спасибо.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.08.2013, 13:03     Подскажите в чем ошибка в моей программе (рекурсия) #16
Цитата Сообщение от Nikko12 Посмотреть сообщение
Если cin >> не добавляет '\0', в конец строку, то как тогда он узнает, где она заканчитвается??
А зачем ему это знать? Ему нужно знать, когда ввод закончить. А вы сами, наверное, знаете, как работает cin >> при чтении символов? Читает до первого пробельного символа, пропуская начальные пробельные, и ему совершенно безразлично, в какой размер строки он читает. Остальное дело самого объекта string, который знает свой размер и умеет его менять под нужное количество символов.

Цитата Сообщение от Nikko12 Посмотреть сообщение
P.S. Код вполне отлино работал если его переделать без функций
И как это могло быть, если вы конец строки определяете по '\0', которого нет в string, если чтение было чере cin >>? Или вы думаете, что я это выдумал?

Цитата Сообщение от Nikko12 Посмотреть сообщение
если его переделать без функций т.е. рекурсию заменить на goto и все перенести в main(). Почему он сейчас не хочет работать? Ведь нечего не менялось кардинально?
Замена goto на рекурсию - это и есть кардинально, совершенно не одно и тоже.
Nikko12
 Аватар для Nikko12
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 162
24.08.2013, 07:40  [ТС]     Подскажите в чем ошибка в моей программе (рекурсия) #17
alsav22,
Насколько я знаю, компилятор сам добавляет в конец строки \0, что бы знать где она заканчивается, т.е. поседний символ строки всегда \0. Или я не прав?
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
24.08.2013, 08:05     Подскажите в чем ошибка в моей программе (рекурсия) #18
Цитата Сообщение от Nikko12 Посмотреть сообщение
Или я не прав?
string - это класс, а не строка символов с нулём в конце.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.08.2013, 13:05     Подскажите в чем ошибка в моей программе (рекурсия) #19
Цитата Сообщение от Nikko12 Посмотреть сообщение
alsav22,
Насколько я знаю, компилятор сам добавляет в конец строки \0, что бы знать где она заканчивается, т.е. поседний символ строки всегда \0. Или я не прав?
Когда читает в массив char, то добавляет. Получается строка С. Если читает в объект string, то нет. Объект string содержит в себе свой размер, поэтому наличие '\0', для определения конца строки, ему не нужно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2013, 10:18     Подскажите в чем ошибка в моей программе (рекурсия)
Еще ссылки по теме:

C++ в чем ошибка в программе?
C++ Подскажите в чем ошибка
C++ Подскажите, в чем ошибка?

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

Или воспользуйтесь поиском по форуму:
Nikko12
 Аватар для Nikko12
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 162
25.08.2013, 10:18  [ТС]     Подскажите в чем ошибка в моей программе (рекурсия) #20
alsav22,
Большое спасибо за ответ.
Yandex
Объявления
25.08.2013, 10:18     Подскажите в чем ошибка в моей программе (рекурсия)
Ответ Создать тему
Опции темы

Текущее время: 03:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru