KiberCuber
@KiberCuber

Задача на строки в Си: как конкатенировать строки без библиотечных функций(старый вопрос удален)?

Задача, данная мне, состоит в том, чтобы "склеить" две строки, которые изначально заданы как массив символов (в общем-то в С по-другому и нет нужды делать). Я старался сам прийти к решению, но все же в итоге пришлось обратиться к интернету, и вот что я нашел : код с источником. Как можно было сделать то же самое, но при помощи традиционной обработки массива? К слову, в коде мне нельзя использовать никакие библиотечные функции, кроме strlen().
(тут была проблема с тегами, посоветуйте расстановку на будущее, чтоб такого не повторялось)
  • Вопрос задан
  • 184 просмотра
Решения вопроса 1
RiseOfDeath
@RiseOfDeath
Диванный эксперт.
В общем решение задачи:
Берете через strlen определяете сдлины строк A и B
Выделяете массив длинной strlen(A) + strlen(B) + 1
делаете mempcy строки A в новый массив с начала, затем memcpy строки B в новый со смешением на длинну строки A, добавляете в конец массива '\0'.

К слову, в коде мне нельзя использовать никакие библиотечные функции, кроме strlen().


И даже memcpy?
Если прям нельзя библиотечные функции юзать - сделайте свой memcpy - это реально очень просто.
Вообще тогда непонятно чего бы и strlen не запретить - его тоже реализовать не шибко сложно.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@res2001
Developer, ex-admin
Как можно было сделать то же самое, но при помощи традиционной обработки массива?

А что такого по вашей ссылке не традиционного в смысле обработки массива? Там вполне традиционные операции.
Видимо вы привыкли, что обращение к элементам массива это arr[i]. Но это лишь один из вариантов.
Вариант примененный в коде по ссылке - инкремент указателей - просто смещает указатель на следующий элемент массива. По идее это должно работать немного быстрее, чем arr[i].
Кстати, принцип работы итераторов в C++ std как раз тот же самый, что использован тут. Так что можете считать, что dest и src это итераторы по строке :-)

Если очень хочется, то можете переписать код с применением индексации. Ничего сложного в таком преобразовании кода нет.

По ссылке, реализован аналог strcat, но эта функция (так же как и функция по ссылке) может приводить к выходам за пределы массива, т.к. тут вообще ни как не контролируется размеры массивов. Было бы интересно реализовать аналоги strncat или strncat_s.
Ответ написан
Комментировать
CityCat4
@CityCat4
//COPY01 EXEC PGM=IEBGENER
Как можно было сделать то же самое, но при помощи традиционной обработки массива?

Там самая что ни на есть традиционнейшая обработка массивов - традиционней просто некуда. Запись вида a[b] imho - может быть показатель того, что автор еще не до конца понимает, как С работает с памятью.

Вообще массив - это математическая абстракция. Сама по себе запись a[1] = 2 никакого особо смысла не имеет. А вот с точки зрения С - массив вещь вполне конкретная и указывает на конкретную ячейку памяти, с которой он начинается.

И вот тут начинаетс самое интересное. Поскольку "массив" у нас - область памяти, то мы можем обьявить его любым типом. Приведем к типу структуры - будет массив структур, приведем к char - будет строка :)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы