Как использовать Strcpy () на языке C?

How Use Strcpy C Language



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

Синтаксис:

char* strcpy (char*destination_location, const char*исходная_строка);

Понимание strcpy ():

Единственная цель функции strcpy () - скопировать строку из источника в место назначения. Теперь давайте посмотрим на приведенный выше синтаксис функции strcpy (). Функция strcpy () может принимать два параметра:







  • char * пункт назначения
  • const char * источник

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



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



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





Примеры:

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

  1. strcpy () - Нормальная работа (example1.c)
  2. strcpy () - Случай-1 (example2.c)
  3. strcpy () - Случай-2 (example3.c)
  4. strcpy () - Случай-3 (example4.c)
  5. strcpy () - Пользовательская версия (example5.c)
  6. strcpy () - оптимизированная версия, определенная пользователем (example6.c)

strcpy () - Нормальная работа (example1.c):

В этом примере программы показано, как выполнить обычную операцию копирования строки с помощью функции strcpy () на языке программирования C. Обратите внимание, что длина целевой строки составляет 30 (char destination_str [30];), что больше, чем длина исходной строки (длина 18, включая символ NULL), так что адресат может вместить все символы из исходная строка.



#включают
#включают

intглавный()
{
charsource_str[] знак равно 'www.linuxhint.com';
chardestination_str[30];

printf ('Перед вызовом функции strcpy (): п п');
printf (' тИсходная строка =% s п',source_str);
printf (' тСтрока назначения =% s п п',destination_str);

strcpy (destination_str,source_str);

printf ('После выполнения функции strcpy (): п п');
printf (' тИсходная строка =% s п',source_str);
printf (' тСтрока назначения =% s п п',destination_str);

возвращение 0;
}

strcpy () - Случай-1 (example2.c):

Цель этой примерной программы - четко объяснить, что происходит, когда длина целевой строки меньше длины исходной строки. В таких случаях в месте назначения не будет достаточно пробелов / байтов для размещения всех символов (включая символ NULL) из исходной строки. Вы всегда должны помнить о двух вещах:

  1. Функция strcpy () не проверяет, достаточно ли места в месте назначения.
  2. Это может быть опасно для встроенного программного обеспечения, потому что strcpy () заменит область памяти за границей места назначения.

Давайте посмотрим на пример программы. Мы объявили source_str и инициализировали его как www.linuxhint.com , который займет 18 байт в памяти для хранения, включая нулевой символ в конце строки. Затем мы объявили другой массив символов, то есть destination_str, размером всего 5. Итак, destination_str не может содержать исходную строку с общим размером 18 байт.

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

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

#включают
#включают

intглавный()
{
charsource_str[] знак равно 'www.linuxhint.com';
chardestination_str[5];

printf ('Перед вызовом функции strcpy (): п п');
printf (' тИсходная строка =% s п',source_str);
printf (' тСтрока назначения =% s п п',destination_str);

strcpy (destination_str,source_str);

printf ('После выполнения функции strcpy (): п п');
printf (' тИсходная строка =% s п',source_str);
printf (' тСтрока назначения =% s п п',destination_str);

// printf ('Исходный адрес =% u (0x% x) n', & source_str [0], & source_str [0]);
// printf ('Адрес назначения =% u (0x% x) n', & destination_str [0], & destination_str [0]);

возвращение 0;
}

strcpy () - Случай-2 (example3.c):

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

  • source_str в www.linuxhint.com [размер = 17 + 1 = 18]
  • destination_str до I_AM_A_DESTINATION_STRING [size = 25 + 1 = 26]

Функция strcpy () скопирует все 17 символов и символ NULL из исходной строки в строку назначения. Но он не будет заменять / изменять оставшиеся байты (байты с 19 по 26, в зависимости от одного) в целевом массиве. Мы использовали цикл for для перебора целевого массива и печати всего массива, чтобы доказать, что байты с 19 по 26 не изменились в целевом массиве. Вот почему мы видим последний вывод как:

www.linuxhint.com_STRING .

#включают
#включают


/ * Эта программа иллюстрирует ситуацию, когда:

размер целевой строки> размер исходной строки

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

Примечание. Размер целевой строки всегда должен
быть больше или равно исходной строке.
* /

intглавный()
{
charsource_str[] знак равно 'www.linuxhint.com';
chardestination_str[26] знак равно 'I_AM_A_DESTINATION_STRING';

printf ('Перед вызовом функции strcpy (): п п');
printf (' тИсходная строка =% s п',source_str);
printf (' тСтрока назначения =% s п п',destination_str);

strcpy (destination_str,source_str);

printf ('После выполнения функции strcpy (): п п');
printf (' тИсходная строка =% s п',source_str);
printf (' тСтрока назначения =% s п п',destination_str);


/ * печать целевой строки с использованием цикла for * /
printf ('Вывести целевую строку char с помощью char: п п');
printf (' тСтрока назначения = ');

для(intязнак равно0;я<25;я++)
{
printf ('% c',destination_str[я]);
}
printf (' п п');

возвращение 0;
}

strcpy () - Случай-3 (example4.c):

Мы рассмотрели эту программу как пример, чтобы показать, что мы никогда не должны вызывать strcpy () со строковым литералом в качестве адресата. Это приведет к неопределенному поведению и, в конечном итоге, произойдет сбой программы.

#включают
#включают

intглавный()
{
charsource_str[] знак равно 'www.linuxhint.com';

printf ('Перед вызовом функции strcpy (): п п');
printf (' тИсходная строка =% s п',source_str);

/ * Никогда не вызывайте strcpy () со строковым литералом в качестве пункта назначения.
Программа вылетит.
* /

strcpy ('destination_str',source_str);

printf ('После выполнения функции strcpy (): п п');
printf (' тИсходная строка =% s п',source_str);

возвращение 0;
}

strcpy () - Пользовательская версия (example5.c):

В этом примере программы мы показали, как написать пользовательскую версию функции strcpy ().

#включают
char *strcpy_user_defined(char *dest, const char *src);

/ * Пользовательская версия функции strcpy () * /
char *strcpy_user_defined(char *dest, const char *src)
{
char *dest_backupзнак равноdest;

в то время как(*srcзнак равно ' 0') / * Итерировать, пока не будет найдено ' 0'. * /
{
*destзнак равно *src; / * Копируем исходный символ в место назначения * /
src++; / * Увеличиваем указатель источника * /
dest++; / * Увеличиваем указатель назначения * /
}

*destзнак равно ' 0'; / * Явно вставляем ' 0' в место назначения * /

возвращениеdest_backup;
}

intглавный()
{
charsource_str[] знак равно 'www.linuxhint.com';
chardestination_str[30];

printf ('Перед вызовом определяемой пользователем функции копирования строки: п п');
printf (' тИсходная строка =% s п',source_str);
printf (' тСтрока назначения =% s п п',destination_str);

/ * Вызов пользовательской функции копирования строки * /
strcpy_user_defined(destination_str,source_str);

printf ('После выполнения определенной пользователем функции копирования строки: п п');
printf (' тИсходная строка =% s п',source_str);
printf (' тСтрока назначения =% s п п',destination_str);

возвращение 0;
}

strcpy () - Версия, оптимизированная пользователем (example6.c):

Теперь в этом примере программы мы собираемся оптимизировать пользовательскую версию strcpy ().

#включают
char *strcpy_user_defined(char *dest, const char *src);


/ * Оптимизированная версия пользовательской функции strcpy () * /
char *strcpy_user_defined(char *dest, const char *src)
{
char *dest_backupзнак равноdest;

в то время как(*dest++ знак равно *src++)
;

возвращениеdest_backup;
}

intглавный()
{
charsource_str[] знак равно 'www.linuxhint.com';
chardestination_str[30];

printf ('Перед вызовом определяемой пользователем функции копирования строки: п п');
printf (' тИсходная строка =% s п',source_str);
printf (' тСтрока назначения =% s п п',destination_str);

/ * Вызов пользовательской функции копирования строки * /
strcpy_user_defined(destination_str,source_str);

printf ('После выполнения определенной пользователем функции копирования строки: п п');
printf (' тИсходная строка =% s п',source_str);
printf (' тСтрока назначения =% s п п',destination_str);

возвращение 0;
}

Заключение :

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