Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Свой функция strcat 
:(
    Опции темы
Dremuk
Дата 28.12.2014, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 17.12.2009

Репутация: нет
Всего: нет



Помогите с задачкой.
Есть задание:
Написать свою функцию конкатенации строк с использованием массивов и указателей (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 не происходило.
Спасибо.
PM MAIL   Вверх
feodorv
Дата 28.12.2014, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Dremuk @  28.12.2014,  19:09 Найти цитируемый пост)
Функция с массивами работает хорошо.

Я лично не понял, в чем отличие использования массивов от указателей. Не суть. В коде присутствует гнусная ошибка:
Цитата(Dremuk @  28.12.2014,  19:09 Найти цитируемый пост)
char* Concat_mas(char s1[N], char s2[N])
{
  char dest[N];
  ...
  return dest;
}

Массив dest объявлен внутри функции и действителен только внутри функции. За её пределами массив байт, на который ссылается dest, может быть перетёрт другими вызовами функций. Исправить ситуацию можно по-разному, например, сделав массив dest внешним по отношению к функции Concat_mas:
Код

char* Concat_mas(char dest[N], char s1[N], char s2[N])
{
  ...
}


Ну и, конечно, нужно проверять, что L1+L2 всё-таки меньше N.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Dremuk
Дата 29.12.2014, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 17.12.2009

Репутация: нет
Всего: нет



feodorv, спасибо.
Просто препод дал задачку такую.
В одной функции использовать только массивы и [].
В другой функции - только указатели. Вообще без [].
С указателями работает, но только s1 перезаписывается. Можно ли сделать так, чтобы s1 и s2 не изменялись вообще, а результат передавался только через имя функции?
PM MAIL   Вверх
konshyn
Дата 29.12.2014, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Цитата(Dremuk @  29.12.2014,  08:59 Найти цитируемый пост)
Можно ли сделать так, чтобы s1 и s2 не изменялись вообще, а результат передавался только через имя функции? 

в функции использовать статический массив


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
Dremuk
Дата 30.12.2014, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 17.12.2009

Репутация: нет
Всего: нет



А с указателями никак?

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
konshyn
Дата 30.12.2014, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Цитата(Dremuk @  30.12.2014,  09:27 Найти цитируемый пост)
А с указателями никак?

не понимаю вопроса



--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
konshyn
Дата 30.12.2014, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



могу предположить, что требуется это:
Код

char* Concat_ptr(char *s1, char *s2) {
    static char *str = calloc(N, sizeof(char));
    memset(str, 0, N * sizeof(char));
    char *tmp_str = str; 
    while (*s1) {
        *tmp_str = *s1;
        s1++;
        tmp_str++;
    }
    while (*s2) {
        *tmp_str = *s2;
        s2++;
        tmp_str++;
    }
  
    return (str);
}




Это сообщение отредактировал(а) konshyn - 30.12.2014, 10:55


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1274 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.