Пишем strcat в С++

Хотите знать как происходит добавление одной строки в конец другой? Как это можно сделать без strcat ? Я захотел.
Всё довольно просто! Всё что вам необходимо знать, чтобы понять это — указатели с++.
Вот текст программы:

#include <iostream>
#include <cstring>
using namespace std;

/* объявляем функцию */
void mystrcat(char *s1,char *s2,int len=0);

int main() {
    /* задаём две строки */
    char str1[80] = "Это тест.";
    char str2[80] = "0123456789";

    mystrcat(str1, str2, 5); // Присоединяем только 5 символов.
    cout << str1 << '\n';

    strcpy(str1, "Это тест."); // Восстанавливаем str1.
    mystrcat(str1, str2); // Присоединяем всю строку

    cout << str1 <<    '\n';
    return 0;
}

void mystrcat (char *s1 , char *s2,int len){

while(*s1) s1++;  // находим конец строки s1

    if(len == 0) len= strlen(s2);

    while(*s2 && len) {
        *s1 = *s2; // Копируем символы.
        s1++;
        s2++;
        len--;
    }
    *s1 = '\0'; // Завершаем строку s1 нулевым символом.
}

Заметьте, что мы подключили библиотеку cstring только для того, чтобы не писать реализацию функции strlen(), это уже тема другой статьи.
Обратите внимание, что функция mystrcat присоединяет len символов новой строки, но если этот параметр не указан, присоединяется вся строка целиком.
Как это работает? По умолчанию указатель s1 содержит ссылку на первый элемент массива str. Мы проходя в цикле все элементы находим его конец и устанавливаем ссылку на него (добавлять ведь надо в конец). После чего делается проверка на «заданность» длины копируемой строки. И пока существует соответствующий элемент массива str и оставшаяся для копирования длина строки не нулевая, копируем символы при помощи указателей из одной строки в другую. При каждом проходе необходимо передвигать указатели на следующий элемент массива, а оставшуюся длину уменьшать. В конце необходимо добавить символ конца строки — ‘\0’.

Вывод программы примерно таков:

Это тест.01234
Это тест.0123456789

Всё отлично сработало 😉

ps по такому принципу построены многие функции! теперь вы знаете как всё это делается на низком уровне)

Похожий код:

Фото аватара
Алексей Петров

Программист, разработчик с 5 летним опытом работы. Учусь на разработчика игр на Unity и разработчика VR&AR реальности (виртуальной реальности). Основные языки программирования: C#, C++.

Оцените автора
Бла, бла код
Добавить комментарий