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

Рекурсия: скопировать первую строку в конец второй - C++

Восстановить пароль Регистрация
 
trinkle69
0 / 0 / 0
Регистрация: 01.10.2013
Сообщений: 16
24.10.2013, 12:52     Рекурсия: скопировать первую строку в конец второй #1
День добрый. Задачка попалась не из лёгких как по мне. Условие вот:
Функция принимает две строки. С помощью рекурсии нужно скопировать первую, в конец второй.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11819 / 6798 / 769
Регистрация: 27.09.2012
Сообщений: 16,870
Записей в блоге: 2
Завершенные тесты: 1
24.10.2013, 13:18     Рекурсия: скопировать первую строку в конец второй #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
void foo ( const char * first , char * second ) {
    for ( ; *second ; ++second ) {
    }
    *(second++) = *first ;
    if ( *first == 0 )
        return ;
    *second = 0 ;   
    foo ( ++first , second ) ;
}
 
int main ( ) {
    char str1 [ 1024 ] = "String 1" ;
    char str2 [ 1024 ] = "String 2 " ;
    std :: cout << str1 << "\n" << str2 << std :: endl ;
    foo ( str1 , str2 ) ;
    std :: cout << str1 << "\n" << str2 << std :: endl ;
}
Rivory
146 / 112 / 2
Регистрация: 15.01.2013
Сообщений: 266
24.10.2013, 15:17     Рекурсия: скопировать первую строку в конец второй #3
Выглядит красиво. Но я так и не понял логику работы функции. А когда пытаюсь её в дебагере расковырять, она вообще работает как-то неадекватно

Не можете написать комментарии к функции, очень интересно. (Я не топик стартер, кстати, просто интересно стало.)
trinkle69
0 / 0 / 0
Регистрация: 01.10.2013
Сообщений: 16
24.10.2013, 19:51  [ТС]     Рекурсия: скопировать первую строку в конец второй #4
Croessmah, я лично тоже ничего не понял..

Добавлено через 1 час 42 минуты
Вот что получилось у меня исходя из твоего кода.. Но теперь у меня другая проблема. У меня после первого элемента, который я добавляю в конец другой строки, не ставится ноль, и так далее со всеми элементами. Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "stdafx.h"
#include <iostream>
using namespace std;
void copy(char str1[30],char str2[30],int i) 
{
    int len=strlen(str1);
    str1[len++]=str2[i];
    
    if (str2[i]==0)
        return;
   
    copy (str1,str2,++i) ;
}
 
void main ( ) {
    char str1[30];
    char str2[30];
    cin>>str1>>str2;
    copy(str1,str2,0);
    cout << str1 << endl;
}
gng
605 / 451 / 122
Регистрация: 08.09.2013
Сообщений: 1,152
24.10.2013, 20:08     Рекурсия: скопировать первую строку в конец второй #5
Вариация на ту же тему (main взята у Croessmah)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <string.h>
 
void foo ( const char * first , char * second ) {
  if (*first) {
    *(second)= *first;
    foo ( ++first , ++second ) ;
  }
  else *(second)= 0;
}
 
int main ( ) {
    char str1 [ 1024 ] = "String 1" ;
    char str2 [ 1024 ] = "String 2 " ;
    std :: cout << str1 << "\n" << str2 << std :: endl ;
    foo ( str1 , str2 + strlen (str2) ) ;
    std :: cout << str1 << "\n" << str2 << std :: endl ;
}
Добавлено через 4 минуты
PS. Одна строка из его main все же у меня изменена.
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
24.10.2013, 21:10     Рекурсия: скопировать первую строку в конец второй #6
C++
1
2
3
4
void Strcpy(char *s, char *t) 
{
    *s ? Strcpy(s + 1, t) : ((*s = *t) ? Strcpy(s + 1, t + 1) : *s);
}
gng
605 / 451 / 122
Регистрация: 08.09.2013
Сообщений: 1,152
24.10.2013, 21:43     Рекурсия: скопировать первую строку в конец второй #7
Thinker, это на каком диалекте языка в ? могут стоять void и char?

Добавлено через 5 минут
PS.
Цитата Сообщение от Thinker Посмотреть сообщение
(*s = *t) ? Strcpy(s + 1, t + 1) : *s
Слева void, справа char

Добавлено через 3 минуты
PPS. А в остальном оригинально - одна строка.
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
24.10.2013, 22:00     Рекурсия: скопировать первую строку в конец второй #8
gng, вот так правильнее, но по другой причине)
C++
1
2
3
4
char *Strcpy(char *s, char *t, int flag = 1) 
{
    return (*s && flag) ? Strcpy(s + 1, t) : ((*s = *t) ? Strcpy(s + 1, t + 1, 0) : s);
}
gng
605 / 451 / 122
Регистрация: 08.09.2013
Сообщений: 1,152
24.10.2013, 22:28     Рекурсия: скопировать первую строку в конец второй #9
Да, другая причина более коварна, и при статическом буфере под строку даже всегда будет давать верный результат )))
trinkle69
0 / 0 / 0
Регистрация: 01.10.2013
Сообщений: 16
25.10.2013, 01:44  [ТС]     Рекурсия: скопировать первую строку в конец второй #10
Ребятки, что на счет редактирования моего кода.. Стиль который используете Вы, мне не знаком, я только учусь ))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2013, 10:33     Рекурсия: скопировать первую строку в конец второй
Еще ссылки по теме:

Переместить в слове первую букву в конец слова C++
Поменять местами первую строку матрицы и строку, содержащую максимальный отрицательный элемент C++
C++ В матрице поменять местами первую строку и строку содержащую максимальный отрицательный элемент

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

Или воспользуйтесь поиском по форуму:
gng
605 / 451 / 122
Регистрация: 08.09.2013
Сообщений: 1,152
25.10.2013, 10:33     Рекурсия: скопировать первую строку в конец второй #11
Цитата Сообщение от trinkle69 Посмотреть сообщение
У меня после первого элемента, который я добавляю в конец другой строки, не ставится ноль, и так далее со всеми элементами.
Каким образом ноль должен добавляться?
Если после строки в буфере забиты нули, то ваша программа будет работать.
Yandex
Объявления
25.10.2013, 10:33     Рекурсия: скопировать первую строку в конец второй
Ответ Создать тему
Опции темы

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