![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Dremuk |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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 не происходило. Спасибо. |
|||
|
||||
feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Я лично не понял, в чем отличие использования массивов от указателей. Не суть. В коде присутствует гнусная ошибка:
Массив dest объявлен внутри функции и действителен только внутри функции. За её пределами массив байт, на который ссылается dest, может быть перетёрт другими вызовами функций. Исправить ситуацию можно по-разному, например, сделав массив dest внешним по отношению к функции Concat_mas:
Ну и, конечно, нужно проверять, что L1+L2 всё-таки меньше N. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
Dremuk |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 17.12.2009 Репутация: нет Всего: нет |
feodorv, спасибо.
Просто препод дал задачку такую. В одной функции использовать только массивы и []. В другой функции - только указатели. Вообще без []. С указателями работает, но только s1 перезаписывается. Можно ли сделать так, чтобы s1 и s2 не изменялись вообще, а результат передавался только через имя функции? |
|||
|
||||
konshyn |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 19.9.2013 Репутация: нет Всего: нет |
в функции использовать статический массив -------------------- «Потому что ценность акта действия в этой стране возрастает в несколько раз». |
|||
|
||||
Dremuk |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 17.12.2009 Репутация: нет Всего: нет |
||||
|
||||
konshyn |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 19.9.2013 Репутация: нет Всего: нет |
-------------------- «Потому что ценность акта действия в этой стране возрастает в несколько раз». |
|||
|
||||
konshyn |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 19.9.2013 Репутация: нет Всего: нет |
могу предположить, что требуется это:
Это сообщение отредактировал(а) konshyn - 30.12.2014, 10:55 -------------------- «Потому что ценность акта действия в этой стране возрастает в несколько раз». |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |