strcpy в C++: копирование строк

В данном уроке мы рассмотрим функцию strcpy, доступную при подключении <cstring>. Данная функция позволяет нам копировать строки в стиле C (массивы символов char[]). Мы разберем несколько примеров использования данной функции, а в конце вы найдете упражнения, которые помогут вам закрепить изученный материал на практике.

Иллюстрация strcpy

Копирование строк с помощью strcpy

Прототип функции strcpy имеет следующий вид:

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

Сама функция будет копировать символы до тех пор, пока не дойдет до специального символа \0, который означает конец строки:

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

int main() {
  char source[] = "Использование функции strcpy";
  char destination[sizeof(source)];

  strcpy(destination, source);

  cout << "source = " << source << endl;
  cout << "destination = " << destination << endl;

  return 0;
}

Вывод:

source = Использование функции strcpy
destination = Использование функции strcpy

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

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

int main() {
  char source[] = "strcpy";
  char destination[4];

  strcpy(destination, source);
  cout << "destination = " << destination << endl;

  return 0;
}
destination = str
destination = strcpy
destination = s
Ошибка выполнения

Как самому реализовать strcpy

Теперь давайте попробуем реализовать функцию strcpy сами, чтобы лучше понять, как она работает. Для этого нам нужно пройтись по строке source, копируя символы в destination. Условием завершения копирования будет достижение символа \0:

#include <iostream>
using namespace std;

char* strcpy(char* destination, const char* source) {
  char* current = destination;

  // проходим по массиву до тех пор, пока не встретим '\0'
  while (*source != '\0') {
    // копируем символ
    *current = *source;

    // сдвигаем указатели на одну ячейку вперед
    source++;
    current++;
  }

  // последний штрих, указываем конец строки
  *current = '\0';

  // и нужно не забыть вернуть указатель на скопированную строку
  return destination;
}

int main() {
  char source[] = "Использование функции strcpy";
  char destination[sizeof(source)];

  strcpy(destination, source);

  cout << "source = " << source << endl;
  cout << "destination = " << destination << endl;

  return 0;
}

Вывод:

source = Использование функции strcpy
destination = Использование функции strcpy

Вывод программы идентичен, поскольку наша функция strcpy делает тоже самое, что и стандартная strcpy из C++ библиотеки <cstring>.

Упражнения

Конечно, давайте модифицируем первое упражнение:

  1. Обратное копирование строки:
    Напишите программу на C++, которая копирует строку source в строку destination, но в обратном порядке, используя функцию вашу собственную версию strcpy. Например, если исходная строка “Привет”, то скопированная строка будет “тевирП”. Ваша программа должна отображать исходную строку и результат после копирования.

  2. Сравнение строк:
    Напишите программу, которая сначала копирует строку source в destination, а затем проверяет идентичны ли исходная строка и скопированная. Результат проверки (идентичны или нет) выводится на экран.

  3. Копирование строки с добавлением символов:
    Модифицируйте свою версию функции strcpy, чтобы перед скопированной строкой в destination добавлялась фраза “Копия: “. Таким образом, если исходная строка была “Привет, мир!”, результатом копирования будет “Копия: Привет, мир!“. Ваша программа должна отображать исходную строку и результат после копирования.

Обсуждение