Функция Strcpy () в C
В этом руководстве мы обсудим, как использовать функцию strcpy () на языке C. Функция strcpy () является частью стандартной библиотеки C и используется для выполнения операций копирования строк. Он включен в файл заголовка string.h и должен быть импортирован перед использованием функции.
Основное использование
Синтаксис функции strcpy:
Функция strcpy () используется для копирования строки, на которую указывает указатель источника (src), в место назначения (dest). Он принимает аргументы с двумя указателями на char или массив символов. Функция копирует все символы из исходной строки в место назначения. Функция также копирует завершающий нулевой символ из источника в место назначения. Она возвращает адрес указателя целевой строки.
Чтобы гарантировать, что функция strcpy () не изменяет исходную строку, аргументу источника (src) предшествует модификатор константа.
Пример 1
Следующая простая программа демонстрирует, как работает функция strcpy ().
int main ( ) <
char src [ ] = «C programming» ;
char dest [ 100 ] ;
После запуска программы, описанной выше, значение целевой строки должно содержать значение исходной строки после выполнения функции strcpy ().
Пример 2
Давайте возьмем еще один пример, где строка назначения уже содержит значение. Например: предположим, что у нас есть пример программы:
int main ( ) <
char src [ ] = «C programming» ;
char dest [ ] = «Hello world from C programming» ;
Как показано в приведенном выше примере, целевая строка уже содержит массив символов. Как только мы вызываем функцию strcpy (), ее содержимое перезаписывается новым значением исходной строки.
Следовательно, функция strcpy () не добавляет содержимое исходной строки к месту назначения. Вместо этого он полностью перезаписывает целевую строку новым значением.
Пример 3
Возьмем пример, показанный ниже, где размер целевой строки слишком мал, чтобы вместить исходную строку.
int main ( ) <
char src [ ] = «C programming» ;
char dest [ 10 ] ;
Если вы запустите указанную выше программу, она не вылетит. Однако, как вы можете видеть, размер целевой строки слишком мал, чтобы вместить исходную строку.
Поскольку функция strcpy () не проверяет, достаточен ли размер целевой строки для хранения исходной строки, она начнет копировать строку, пока не достигнет нулевого завершающего символа. Это приведет к переполнению программы и перезаписи участков памяти, которые могут быть предназначены для других переменных.
В нашем примере выше это приведет к тому, что программа перезапишет саму исходную строку с выводом, как показано:
Пример 4
Другой распространенной ошибкой является передача строкового литерала функции strcpy () в качестве строки назначения.
Приведенный выше пример программы вызовет ошибку, и программа выйдет из строя с ошибкой сегментации.
Заключение
В этом кратком руководстве мы обсудили различные сценарии использования функции C strcpy () для копирования строки из источника в место назначения. Хорошо убедиться, что функция strcpy () работает правильно, чтобы избежать таких ошибок, как переполнение памяти.
_mbscpy не может использоваться в приложениях, выполняемых в среда выполнения Windows. Дополнительные сведения: Функции CRT, которые не поддерживаются в приложениях универсальной платформы Windows.
Синтаксис
Параметры
strDestination
Конечная строка.
strSource
Исходная строка, завершающаяся символом NULL.
Возвращаемое значение
Каждая из этих функций возвращает строку назначения. Нет зарезервированных возвращаемых значений для указания ошибки.
Remarks
Так как не strcpy проверяет наличие достаточного места в стрдестинатион перед копированием, это может strSource привести к переполнению буфера. Поэтому рекомендуется использовать strcpy_s вместо него.
В C++ эти функции имеют шаблонные перегрузки, которые вызывают более новые и безопасные аналоги этих функций. Дополнительные сведения см. в разделе Безопасные перегрузки шаблонов.
По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это, см. раздел глобальное состояние в CRT.
Универсальное текстовое сопоставление функций
| TCHAR.H ассемблер | _UNICODE & _MBCS не определено | _MBCS определяется | _UNICODE определяется |
|---|---|---|---|
| _tcscpy | strcpy | _mbscpy | wcscpy |
Требования
| Подпрограмма | Обязательный заголовок |
|---|---|
| strcpy | |
| wcscpy | либо |
| _mbscpy |
Дополнительные сведения о совместимости см. в статье Compatibility.
_mbscpy_s и _mbscpy_s_l не могут использоваться в приложениях, выполняемых в среда выполнения Windows. Дополнительные сведения: Функции CRT, которые не поддерживаются в приложениях универсальной платформы Windows.
Синтаксис
Параметры
dest
Расположение строкового буфера назначения.
src
Исходная строка, завершающаяся нулем.
locale
Используемый языковой стандарт.
Возвращаемое значение
Ноль в случае успешного выполнения; в противном случае — код ошибки.
Ситуации, которые могут привести к ошибке
| dest | dest_size | src | Возвращаемое значение | Содержимое dest |
|---|---|---|---|---|
| NULL | any | any | EINVAL | не изменено |
| any | any | NULL | EINVAL | dest[0] Задайте значение 0. |
| any | 0 или слишком мал | any | ERANGE | dest[0] Задайте значение 0. |
Remarks
Если dest или src является пустым указателем или если размер строки назначения dest_size слишком мал, вызывается обработчик недопустимых параметров, как описано в разделе Проверка параметров. Если выполнение может быть продолжено, эти функции возвращают EINVAL и устанавливают значение, errno EINVAL Если dest или src является пустым указателем, и возвращают ERANGE и устанавливают errno в, ERANGE когда строка назначения слишком мала.
После успешного выполнения конечная строка всегда завершается нулем.
В C++ использование данных функций упрощено наличием шаблонных перегрузок, которые могут автоматически определять длину буфера, а также автоматически заменять более старые, незащищенные функции их новыми безопасными аналогами. Дополнительные сведения см. в разделе Безопасные перегрузки шаблонов.
По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это, см. раздел глобальное состояние в CRT.
Универсальное текстовое сопоставление функций
| TCHAR.H ассемблер | _UNICODE & _MBCS не определено | _MBCS определяется | _UNICODE определяется |
|---|---|---|---|
| _tcscpy_s | strcpy_s | _mbscpy_s | wcscpy_s |
Требования
| Подпрограмма | Обязательный заголовок |
|---|---|
| strcpy_s | |
| wcscpy_s | либо |
| _mbscpy_s |
Эти функции относятся только к Microsoft. Дополнительные сведения о совместимости см. в статье Compatibility.
Пример
В отличие от кода качества производства, этот пример вызывает безопасные строковые функции без проверки на наличие ошибок:
При создании кода C++ версии шаблона могут быть проще в использовании.
Функции для работы со строками в C++

Это конечно не все функции, а только те, которые мы разберём в этой статье.
strlen() (от слова length – длина)
Наша программа, которая подсчитает количество символов в строке:
Так будет выглядеть код, с заменой нашего участка кода на функцию strlen() :
Результат будет и в первой программе и во второй аналогичен:
strcat() (от слова concatenation – соединение)
Программа, которая в конец одной строки, дописывает вторую строку. Другими словами – объединяет две строки.
Реализация объединения двух строк, используя стандартную функцию, заняла одну строчку кода в программе – 14-я строка.
На что следует обратить внимание и первом и во втором коде – размер первого символьного массива должен быть достаточным для помещения символов второго массива. Если размер окажется недостаточным – может произойти аварийное завершение программы, так как запись строки выйдет за пределы памяти, которую занимает первый массив. Например:
strcpy() (от слова copy – копирование)
Реализуем копирование одной строки и её вставку на место другой строки.
Strcpy c что это
ОБЗОР
ОПИСАНИЕ
Функция strncpy() сходна, за исключением того, что скопировано будет только первые n байт из src. Внимание: если в первых n байт из src не окажется нулевого байта, то строка в dest также не будет завершена нулевым байтом.
Если длина src меньше n, strncpy() дописывает в dest нулевые байты, чтобы убедиться, что всего было записано n байт.
Простейшей реализацией strncpy() может быть:
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).
| Интерфейс | Атрибут | Значение |
| strcpy(), strncpy() | безвредность в нитях | безвредно (MT-Safe) |
СООТВЕТСТВИЕ СТАНДАРТАМ
ЗАМЕЧАНИЯ
Единственным правильным (и предполагаемым) использованием strncpy() является копирование C-строки в буфер фиксированной длины с одновременной проверкой того, что буфер не переполнен и неиспользованные байты в целевом буфере обнулены (для исключения возможной утечки информации в случае, если буфер будет записан на носитель или передан другому процессу через межпроцессовое общение).
Если в первых n байт src не будет завершающего нулевого байта, strncpy() создаст ничем не ограниченную строку в dest. Если размер buf равен buflen, вы можете принудительно завершить строку с помощью следующего кода:
strlcpy()
size_t strlcpy(char *dest, const char *src, size_t size);
Эта функция подобна strncpy(), но копирует не более size-1 байт в dest, всегда добавляет конечный байт null и не дополняет назначение (помимо этого) байтами null. В данной функции исправлены некоторые проблемы strcpy() и strncpy(), но вызывающий по-прежнему должен обрабатывать возможность потери данных, если значение size окажется слишком мало. Возвращаемое значение функции — длина src, что позволяет легко обнаружить усечение: если возвращаемое значение больше или равно size, то выполнялось усечение. Если потеря данных неприемлема, то вызывающий должен или проверять аргументы перед вызовом, или проверять возвращаемое значение. Функция strlcpy() отсутствует в glibc и не стандартизована в POSIX, но доступна в Linux из библиотеки libbsd.




