Strcpy s c что это
Перейти к содержимому

Strcpy s c что это

Русские Блоги

Использование и меры предосторожности функций strcpy () и strcpy_s () в C ++

При написании программы на C ++ вы неизбежно столкнетесь с функцией strcpy () и ее безопасной версией strcpy_s (). Фактически, причина, по которой вводится версия функции _s, заключается в том, чтобы сделать программирование более безопасным, но для обеспечения безопасности оно также будет Проще сделать наш код "ошибочным". Итак, вот краткое введение в использование и меры предосторожности функций strcpy () и strcpy_s ().

Прежде всего, мы знаем, что как исходная функция strcpy (), так и функция безопасной версии strcpy_s () существуют в заголовочном файле <cstring>, поэтому программа должна начинаться со следующего оператора:

Во-вторых, исходная функция strcpy () является членом, который существует в стандартном пространстве имен std, поэтому для использования функции strcpy () необходимо добавить следующий оператор:

Или каждый раз, когда вы используете функцию strcpy (), ставьте перед ней префикс пространства имен:

Тем не менее, для самых последних редакторов, которые часто используют функцию strcpy (), вы все равно получите сообщение об ошибке, например, в следующем простом примере:

Обычно с синтаксисом проблем нет, но при запуске Visual Studio 2017 сообщит об ошибке, как показано ниже:

Смысл очень прост, просто чтобы сказать вам, что функция strcpy () небезопасна, вы должны вместо этого использовать функцию strcpy_s (). Во-первых, независимо от того, что происходит после перехода на функцию strcpy_s (), теоретически приведенный выше код синтаксически Это логически правильно, так как вы можете избежать того, что редактор заставит вас использовать безопасную версию?

На самом деле, есть много решений, просто чтобы избежать кода ошибки 4996 на картинке выше, вы можете Используйте функцию избирательного предупреждения редактора Добавьте следующее предложение перед оператором включения:

Но это решение иногда не решает проблему. Например, я пробовал VS2017, и он не работал, тогда мы просто Отключить функцию предупреждения Хорошо, способ сделать это — добавить предложение перед #include <stdio.h> следующим образом:

В 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, strcpy_s

strcpy_s is allowed to clobber the destination array from the last character written up to destsz in order to improve efficiency: it may copy in multibyte blocks and then check for null bytes.

The function strcpy_s is similar to the BSD function strlcpy , except that

  • strlcpy truncates the source string to fit in the destination (which is a security risk)
  • strlcpy does not perform all the runtime checks that strcpy_s does
  • strlcpy does not make failures obvious by setting the destination to a null string or calling a handler if the call fails.

Although strcpy_s prohibits truncation due to potential security risks, it’s possible to truncate a string using bounds-checked strncpy_s instead.

Функция Strcpy () в C

Операторы C Switch Case

Программирование и разработка

В этом руководстве мы обсудим, как использовать функцию strcpy () на языке C. Функция strcpy () является частью стандартной библиотеки C и используется для выполнения операций копирования строк. Он включен в файл заголовка string.h и должен быть импортирован перед использованием функции.

Основное использование

Синтаксис функции strcpy:

Функция strcpy () используется для копирования строки, на которую указывает указатель источника (src), в место назначения (dest). Он принимает аргументы с двумя указателями на char или массив символов. Функция копирует все символы из исходной строки в место назначения. Функция также копирует завершающий нулевой символ из источника в место назначения. Она возвращает адрес указателя целевой строки.

Чтобы гарантировать, что функция strcpy () не изменяет исходную строку, аргументу источника (src) предшествует модификатор константа.

Пример 1

Следующая простая программа демонстрирует, как работает функция strcpy ().

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

int main ( ) <
char src [ ] = «C programming» ;
char dest [ 100 ] ;

printf ( «Source string before copy: %s \n « , src ) ;
printf ( «Destination string before copy: %s \n « , dest ) ;

strcpy ( dest , src ) ;

printf ( «Source string after copy: %s \n « , src ) ;
printf ( «Destination string after copy: %s \n « , dest ) ;

return ;

>

После запуска программы, описанной выше, значение целевой строки должно содержать значение исходной строки после выполнения функции strcpy ().

Пример 2

Давайте возьмем еще один пример, где строка назначения уже содержит значение. Например: предположим, что у нас есть пример программы:

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

int main ( ) <
char src [ ] = «C programming» ;
char dest [ ] = «Hello world from C programming» ;

printf ( «Source string before copy: %s \n « , src ) ;
printf ( «Destination string before copy: %s \n « , dest ) ;

strcpy ( dest , src ) ;

printf ( «Source string after copy: %s \n « , src ) ;
printf ( «Destination string after copy: %s \n « , dest ) ;

return ;

Как показано в приведенном выше примере, целевая строка уже содержит массив символов. Как только мы вызываем функцию strcpy (), ее содержимое перезаписывается новым значением исходной строки.

Следовательно, функция strcpy () не добавляет содержимое исходной строки к месту назначения. Вместо этого он полностью перезаписывает целевую строку новым значением.

Вместо этого он полностью перезаписывает целевую строку новым значением

Пример 3

Возьмем пример, показанный ниже, где размер целевой строки слишком мал, чтобы вместить исходную строку.

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

int main ( ) <
char src [ ] = «C programming» ;
char dest [ 10 ] ;

printf ( «Source string before copy: %s \n « , src ) ;
printf ( «Destination string before copy: %s \n « , dest ) ;

strcpy ( dest , src ) ;

printf ( «Source string after copy: %s \n « , src ) ;
printf ( «Destination string after copy: %s \n « , dest ) ;

return ;

>

Если вы запустите указанную выше программу, она не вылетит. Однако, как вы можете видеть, размер целевой строки слишком мал, чтобы вместить исходную строку.

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

В нашем примере выше это приведет к тому, что программа перезапишет саму исходную строку с выводом, как показано:

В нашем примере выше это приведет к тому, что программа

Пример 4

Другой распространенной ошибкой является передача строкового литерала функции strcpy () в качестве строки назначения.

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

int main ( ) <
char src [ ] = «C programming» ;
printf ( «Source string before copy: %s \n « , src ) ;

strcpy ( » « , src ) ;
printf ( «Source string after copy: %s \n « , src ) ;
return ;

>

Приведенный выше пример программы вызовет ошибку, и программа выйдет из строя с ошибкой сегментации.

Заключение

В этом кратком руководстве мы обсудили различные сценарии использования функции C strcpy () для копирования строки из источника в место назначения. Хорошо убедиться, что функция strcpy () работает правильно, чтобы избежать таких ошибок, как переполнение памяти.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *