strncpy в C/C++: разбираемся с примерами

👋 Привет! В этой статье мы поговорим о функции strncpy. С помощью этой функции мы можем копировать Си-строки из одного места в другое. Отличие этой функции от strcpy заключается в том, что она копирует только первые n байтов. В начале мы посмотрим на несколько примеров использования этой функции. В конце вы найдете упражнения для закрепления материала.

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

Как скопировать Си-строку с помощью strncpy

Функция strncpy объявлена в заголовочном файле <string.h>. В C++ вы можете использовать <cstring>. Выглядит эта функция следующим образом:

char * strncpy ( char * destination, const char * source, size_t num );
  • Первый аргумент - это указатель на строку, в которую будет производиться копирование.
  • Второй аргумент - это строка, которую нам нужно скопировать.
  • Третий аргумент указывает максимальное количество байтов, которые нужно скопировать (символ \0 не влияет на этот лимит).
  • Функция возвращает указатель на скопированную строку destination (первый аргумент).

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

#include <stdio.h>
#include <string.h>

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

  char* result = strncpy(destination, source, 3);

  printf("%s, %s, %s", result, destination, source); 

  return 0;
}

Вывод этой программы:

str, str, string

Как видите, в результате мы получили "str" в result и destination. Также хочу заметить, что строка destination занимает не три, а четыре байта. strncpy добавляет символ окончания строки \0 в конце. Для вывода строк на экран, мы используем функцию printf.

Что произойдет, если num в функции strncpy больше длины исходной строки?

char src[] = "hello";
char dest[10];
strncpy(dest, src, 8);
printf("%s", dest);
Программа выведет “hello” и затем 3 случайных символа.
Программа выведет “hello” и затем 3 пробела.
Программа выведет только “hello”.
Программа выведет ошибку.

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

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

#include <stdio.h>

char* my_strncpy(char* destination, const char* source, size_t num) {
  size_t i = 0;                           // начинаем копирование с начала
  while (source[i] != '\0' && i < num) {  // копируем пока не упремся в \0 или
                                          // не скопируем нужно количество байт
    destination[i] = source[i];           // копируем байт
    i++;                                  // двигаемся вперед
  }

  destination[i] = '\0';  // нужно не забыть пометить конец строки

  return destination;
}

int main() {
  char source[] = "string";
  char destination[7];

  char* result = my_strncpy(destination, source, 3);

  printf("%s, %s, %s", result, destination, source);

  return 0;
}

Вывод программы:

str, str, string

Как видите, наша версия функции работает не хуже стандартной!

Упражнения

  1. Использование strncpy:
    Напишите программу на C++, которая запрашивает у пользователя две строки и число n. Программа должна использовать функцию strncpy для копирования первых n символов из одной строки в другую и затем выводить результат. Ваша программа также должна выводить исходные строки пользователя.

  2. Создание своей версии strncpy:
    Используя предоставленный в статье пример, создайте свою версию функции strncpy. Проверьте ее работу, используя различные строки и значения num.

  3. Сравнение вашей версии strncpy с стандартной:
    Напишите программу, которая сравнивает работу вашей версии функции strncpy с работой стандартной функции. Ваша программа должна использовать обе функции и выводить результаты их работы на экран.

Обсуждение