strcat в C/C++: соединение строк

Привет! В этой статье я тебе расскажу что такое strcat и как ее использовать. Начнем мы с примера использования этой функции. Потом мы попробуем реализовать эту функцию сами. Закончим все это мы упражнениями, которые помогут тебе закрепить материал.

strcat C++

Конкатенация строк при помощи strcat в C/C++

Давай сразу посмотрим на то, как эта функция выглядит:

char * strcat ( char * destination, const char * source );
  • Первым аргументом эта функция принимает строку, к которой мы будем добавлять другую строку. Она должна быть достаточно большой, чтобы вместить в себя результат.
  • Вторым аргументом нужно передать строку, которую ты хочешь добавить к предыдущей.
  • Функция возвращает нам обратно первый аргумент destination.

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

Ах да, забыл сказать. Для того, чтобы использовать эту функцию нужно подключить <cstring> в C++ или <string.h> в C.

Давай теперь посмотрим на пример использования этой функции:

#include <cstring>
#include <iostream>

using namespace std;

int main() {
  // строка должна быть достаточно большой, чтобы вместить в себя
  // обе строки после соединения
  char destination[100] = "C";
  // тут нам без разницы на размер строки
  char plusplus[] = "++";

  char* result = strcat(destination, plusplus);

  cout << "plusplus:" << plusplus << endl;
  cout << "result: " << result << endl;
  cout << "destination: " << destination << endl;
  cout << "result == destination: " << (result == destination) << endl;

  return 0;
}

Ну и давай запустим это чудо человеческой мысли:

plusplus:++
result: C++
destination: C++
result == destination: 1

Ну что, тут нет ничего неожиданного. destination равен result‘у. plusplus никак не поменялся. Ну и мы тут проверил, что result и destination указывают на одну и туже строку. Прекрасно.

Что будет выведено на экран?

#include <cstring>
#include <iostream>

using namespace std;

int main() {
  char first_str[20] = "Open";
  char second_str[] = "AI";

  strcat(first_str, second_str);
  cout << first_str << endl;
  return 0;
}
Open
OpenAI is the best
OpenAI
AI

Давай теперь выделимся из толпы, написав свою версию этой функции.

Пишем свою версию strcat с блэкджеком и массивами

Чтобы показать коллегам свой профессионализм, давай напишем strcat по своему:

#include <cstring>
#include <iostream>

using namespace std;

char* my_strcat(char* destination, const char* source) {
  int len = strlen(destination);

  for (int i = 0; source[i] != '\0'; i++) {
    destination[len + i] = source[i];
  }

  destination[len + strlen(source)] = '\0';

  return destination;
}

int main() {
  char result[100] = "ABC";

  cout << "result = " << my_strcat(result, "DEF") << endl;

  return 0;
}

Ну и конечно давай запустим эту подделку:

result = ABCDEF

Фух, отработало без ошибок. А то пришлось бы краснеть перед всеми.

Ты мог заметить, что я воспользовался функцией strlen. Это твой шанс меня обставить и реализовать my_strcat вообще без помощи встроенных функций. Жду твою реализацию в комментариях.

Упражнения

  1. Основы использования strcat:

    • Напиши программу на C++, которая использует функцию strcat для соединения двух строк, введенных пользователем. Проверь, что результирующая строка соответствует ожидаемой конкатенации.
    • Добавь в программу вывод всех трех строк (исходные две строки и результат их соединения) на экран.
  2. Реализуй свою версию strcat:

    • Используя предоставленный в статье пример, реализуй свою версию функции strcat. Назови ее my_strcat.
    • Протестируй свою версию функции, соединяя разные пары строк, и сравни результаты с работой оригинальной функции strcat.
  3. Реализация my_strcat без strlen:

    • Попробуй написать реализацию функции my_strcat без использования встроенной функции strlen или других встроенных функций.
    • Проверь свою реализацию на различных парах строк и убедись, что она работает корректно.

Обсуждение