Strcpy c что это
Функция 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.
Возвращаемое значение
Каждая из этих функций возвращает строку назначения. Нет зарезервированных возвращаемых значений для указания ошибки.
Комментарии
Так как не strcpy проверяет наличие достаточного места в strcpy перед копированием, это может strSource привести к переполнению буфера. Поэтому рекомендуется использовать strcpy_s вместо него.
Функции wcscpy и _mbscpy являются версиями функции strcpy для расширенных и многобайтовых символов соответственно. Аргументы и возвращаемое значение wcscpy представляют собой двухбайтовые строки; аргументы и возвращаемое значение _mbscpy представляют собой многобайтовые строки. В остальном эти три функции ведут себя идентично.
В 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; |
Комментарии
После успешного выполнения конечная строка всегда завершается нулем.
В 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++ версии шаблона могут быть проще в использовании.
Русские Блоги
Использование и меры предосторожности функций strcpy () и strcpy_s () в C ++
При написании программы на C ++ вы неизбежно столкнетесь с функцией strcpy () и ее безопасной версией strcpy_s (). Фактически, причина, по которой вводится версия функции _s, заключается в том, чтобы сделать программирование более безопасным, но для обеспечения безопасности оно также будет Проще сделать наш код «ошибочным». Итак, вот краткое введение в использование и меры предосторожности функций strcpy () и strcpy_s ().
Во-вторых, исходная функция strcpy () является членом, который существует в стандартном пространстве имен std, поэтому для использования функции strcpy () необходимо добавить следующий оператор:
Или каждый раз, когда вы используете функцию strcpy (), ставьте перед ней префикс пространства имен:
Тем не менее, для самых последних редакторов, которые часто используют функцию strcpy (), вы все равно получите сообщение об ошибке, например, в следующем простом примере:
Обычно с синтаксисом проблем нет, но при запуске Visual Studio 2017 сообщит об ошибке, как показано ниже:
Смысл очень прост, просто чтобы сказать вам, что функция strcpy () небезопасна, вы должны вместо этого использовать функцию strcpy_s (). Во-первых, независимо от того, что происходит после перехода на функцию strcpy_s (), теоретически приведенный выше код синтаксически Это логически правильно, так как вы можете избежать того, что редактор заставит вас использовать безопасную версию?
На самом деле, есть много решений, просто чтобы избежать кода ошибки 4996 на картинке выше, вы можете Используйте функцию избирательного предупреждения редактора Добавьте следующее предложение перед оператором включения:
В VS2017 это предложение должно быть добавлено в заголовочный файл «stdafx.h».
После добавления запустите ту же программу еще раз, и она может работать нормально, результаты отображения показаны на следующем рисунке:
Затем решается проблема неиспользования защищенной версии, а затем объясняется случай использования защищенной версии.
Если мы решим доверять редактору, то мы изменим функцию strcpy () на функцию strcpy_s (). После изменения мы сначала столкнемся со следующей ошибкой:
Это потому, что когда мы использовали функцию strcpy () раньше, мы знали, что эта функция является членом стандартного пространства имен std, и Безопасная версия strcpy_s не является членом пространства имен Таким образом, «std ::» должен быть удален, после удаления запустить снова, и он будет работать нормально.
Но иногда при удалении «std ::» редактор все равно получит сообщение об ошибке: 1. Нет экземпляра перегруженной функции «strcpy_s», которая соответствует списку параметров, 2. «strcpy_s»: функция не принимает 2 параметра.
Это связано с тем, что существует две версии функции strcpy_s () с двумя и тремя параметрами, если можно гарантировать размер буфера.
с тремя параметрами:
errno_t strcpy_s(
char *strDestination,
size_t numberOfElements,
const char *strSource
);
с двумя параметрами:
errno_t strcpy_s(
char (&strDestination)[size],
const char *strSource
); // C++ only
Таким образом, Если мы используем new для выделения пространства хранения, упомянутая выше проблема не может гарантировать размер буфера. 。
Посмотрите на следующий код:
В синтаксисе нет ничего плохого, но поскольку пространство для хранения str временно выделено с помощью new, размер буфера не может быть гарантирован. Щелкните по запуску, и появятся две вышеуказанные ошибки.
Решение этой ситуации на самом деле очень простое, то есть версия, которая не соответствует 2 параметрам: Версия с 3 параметрами Chant. Между двумя строками добавьте параметр для определения длины.
Итак, полный код выглядит следующим образом:
Здесь используется версия функции strcpy_s () с 2 параметрами и 3 параметрами.
Когда позже используется трехпараметрическая версия, общий подход Установить длину для копирования длина строки +1 Поскольку strlen () возвращает длину строки, но не содержит нулевых символов в конце строки, она равна +1.
Код выше работает так, как показано на следующем рисунке:
Выше приведено основное использование и меры предосторожности для функций strcpy () и strcpy_s (), я надеюсь помочь всем
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.