Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.12.2014, 19:20   #1
Dremuk
 
Регистрация: 31.01.2013
Сообщений: 5
По умолчанию Своя функция strcat (C++)

Помогите с задачкой.
Есть задание:
Написать свою функцию конкатенации строк с использованием массивов и указателей (2 функции). Concat(s1,s2)
Вот что у меня вышло
Код:
#define N 100

char* Concat_mas(char s1[N], char s2[N])
{
  int L1=0,L2=0,i;
  char dest[N];
  // Считаем длину строки s1
  while (s1[L1] != '\0') L1++;
  // Считаем длину строки s2
  while (s2[L2] != '\0') L2++;
  // Копируем s1 и s2
  for (i=0; i<L1; i++) dest[i] = s1[i];
  for (i=0; i<L2; i++) dest[L1+i] = s2[i];
  dest[L1+L2]='\0';
  return dest;
}

char* Concat_ptr(char *s1, char *s2)
{
  while (*s1) s1++;
  while (*s1++ = *s2++);
  return (--s1);
}

main()
{
  char s1[N], s2[N], d[N];
  char *dd;

  clrscr();
  gets(s1);  gets(s2);

  printf("Массивы:\n");
  dd=Concat_mas(s1, s2);
  printf("Результирующая строка: %s\n\n", dd);

  printf("Адресная арифметика:\n");
  dd = Concat_ptr(s1, s2);
  printf("Результирующая строка: %s\n\n", s1);      // 1
  printf("Результирующая строка: %s\n\n", dd);      // 2
}
Функция с массивами работает хорошо.
А вот с указателями есть проблема, строка выводит верн, но происходит замена строки s1, а этого нельзя делать.
Вторая строка ничего не выводит вообще.
Можно ли сделать так, чтобы результат возвращался функцией, а изменения s1 и s2 не происходило.
Спасибо.

Последний раз редактировалось Dremuk; 28.12.2014 в 19:22. Причина: Вставил теги CODE
Dremuk вне форума Ответить с цитированием
Старый 28.12.2014, 19:48   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
char dest[N];
Смело...
Код:
char* Concat_mas(char* s1, char* s2)
{
  int j,i,N=0;
  for (i=0; s1[i]; i++) N++;
  for (i=0; s2[i]; i++) N++;

  char* dest=malloc(N+1);

  // Копируем s1 и s2
  for (i=0,j=0; s1[i]; i++) dest[j++] = s1[i];
  for (i=0;s2[i]; i++) dest[j++] = s2[i];

  dest[j]='\0';
  return dest;
}
Годится?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.12.2014, 20:00   #3
Dremuk
 
Регистрация: 31.01.2013
Сообщений: 5
По умолчанию

С массивами понятно.
Но у меня как раз вопрос в Concat_ptr.
Можно ли сделать так, чтобы результат возвращался функцией, а изменения s1 и s2 не происходило.
Dremuk вне форума Ответить с цитированием
Старый 28.12.2014, 20:03   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Можно ли сделать так, чтобы результат возвращался функцией
Т.е. мой пример ты проигнорил? Ладно. Желаю удачи, может кто другой поможет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.12.2014, 20:09   #5
Dremuk
 
Регистрация: 31.01.2013
Сообщений: 5
По умолчанию

Да нет же. С твоим примером я разобрался. Нашел ошибки в своей функции.
С массивами как-то проще.
Вот с указателями не могу понять. Можно ли вообще получить сцепку строк, чтобы входные параметры не изменялись никак
Dremuk вне форума Ответить с цитированием
Старый 28.12.2014, 20:11   #6
Dremuk
 
Регистрация: 31.01.2013
Сообщений: 5
По умолчанию

У тебя в примере используются [] - элементы массива. А мне нужно, чтобы никак не использовались массивы.
Dremuk вне форума Ответить с цитированием
Старый 28.12.2014, 20:18   #7
Dremuk
 
Регистрация: 31.01.2013
Сообщений: 5
По умолчанию

Stilet, сможешь помочь?
Dremuk вне форума Ответить с цитированием
Старый 28.12.2014, 21:00   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

От горе... Похоже что ты всетки не понимаешь в чем смысл указателей...
Ладно. Хочешь пример по типу энумераторов?
Код:
char* Concat_mas(char* s1, char* s2)
{
  int N=0;
  char *q=s1, *w=s2;
  for (; *q;  q++) N++;q=s1;
  for (; *w; w++) N++;w=s2

  char* dest=malloc(N+1), *iter=dest;

  // Копируем s1 и s2
  for (; *q; q++,iter++) *iter = *q;
  for (; *w; w++,iter++) *iter = *w;

  *iter='\0';
  return dest;
}
Особо только не обольшайся. Препод завалит.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Своя функция ReadLN DelhiProgramer Общие вопросы Delphi 4 09.09.2012 09:47
strcat,strcpy Акоб Общие вопросы C/C++ 15 24.04.2011 23:58
Моя strcat Valter Общие вопросы C/C++ 5 12.02.2010 00:30
своя функция LeoN PHP 3 01.08.2009 21:54
strcat larry Win Api 3 20.07.2009 12:44