Как да използвам Strcpy () на език C?

How Use Strcpy C Language



В тази статия ще научим за функцията strcpy () в езика за програмиране C. Функцията strcpy () е много популярна стандартна библиотечна функция за извършване на операцията за копиране на низ в езика за програмиране C. Има няколко стандартни заглавни файла в езика за програмиране на C за извършване на стандартни операции. String.h е един от тези заглавни файлове, който предоставя няколко стандартни библиотечни функции за изпълнение на низови операции. Функцията strcpy () е една от библиотечните функции, предоставени от string.h.

Синтаксис:

char* strcpy (char*destination_location, const char*source_string);

Разбиране на strcpy ():

Единствената цел на функцията strcpy () е да копира низ от източник до местоназначение. Сега нека да разгледаме горния синтаксис на функцията strcpy (). Функцията strcpy () може да приема два параметъра -







  • char * дестинация
  • const char * източник

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



Важният момент, който трябва да забележите тук, е, че функцията strcpy () не добавя изходния низ към целевия низ. Той по -скоро замества съдържанието на дестинацията със съдържанието на низ източника.



Също така функцията strcpy () не извършва никакви проверки, за да се увери, че размерът на дестинацията е по -голям от низ източника, това е изцяло отговорност на програмиста.





Примери:

Сега ще видим няколко примера за разбиране на функцията strcpy ():

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

strcpy () - Нормална работа (пример 1.c):

Тази примерна програма показва как да се извърши нормална операция за копиране на низ, като се използва функцията strcpy () в езика за програмиране C. Моля, обърнете внимание, че дължината на целевия низ е 30 (char destination_str [30];), което е по -голямо от дължината на изходния низ (дължината е 18, включително символа NULL), така че дестинацията може да побере всички знаци от източник низ.



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

intглавен()
{
charsource_str[] = 'www.linuxhint.com';
chardestination_str[30];

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

strcpy (destination_str,source_str);

printf ('След изпълнение на функцията strcpy ():нн');
printf ('TИзточник Низ = %sн',source_str);
printf ('TДестинационен низ = %sнн',destination_str);

връщане 0;
}

strcpy ()-Случай-1 (пример 2.c):

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

  1. Функцията strcpy () няма да провери дали дестинацията има достатъчно място.
  2. Това може да бъде опасно при вградения софтуер, защото strcpy () ще замени областта на паметта извън границата на дестинацията.

Нека разгледаме примерната програма. Декларирахме source_str и го инициализираме на www.linuxhint.com , което ще отнеме 18 байта в паметта за съхранение, включително символа Null в края на низа. След това декларирахме друг масив от символи, т.е. 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 ('TИзточник Низ = %sн',source_str);
printf ('TДестинационен низ = %sнн',destination_str);

strcpy (destination_str,source_str);

printf ('След изпълнение на функцията strcpy ():нн');
printf ('TИзточник Низ = %sн',source_str);
printf ('TДестинационен низ = %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 (пример 3.c):

Тази програма илюстрира ситуацията, когато размерът на низа на местоназначението е по -голям от размера на изходния низ и дестинацията е вече инициализирана с някаква стойност. В този пример ние инициализирахме:

  • source_str към www.linuxhint.com [размер = 17+1 = 18]
  • дестинация_стр до I_AM_A_DESTINATION_STRING [размер = 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 ('TИзточник Низ = %sн',source_str);
printf ('TДестинационен низ = %sнн',destination_str);

strcpy (destination_str,source_str);

printf ('След изпълнение на функцията strcpy ():нн');
printf ('TИзточник Низ = %sн',source_str);
printf ('TДестинационен низ = %sнн',destination_str);


/* отпечатайте низ от местоназначение, използвайки for loop*/
printf ('Отпечатайте низа на дестинацията char чрез char:нн');
printf ('TДестинационен низ = ');

за(inti=0;i<25;i++)
{
printf ('% ° С',destination_str[i]);
}
printf ('нн');

връщане 0;
}

strcpy ()-Случай-3 (пример 4.c):

Разгледахме тази програма като пример, за да покажем, че никога не трябва да извикваме strcpy () с низов литерал като местоназначение. Това ще доведе до неопределено поведение и в крайна сметка програмата ще се срине.

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

intглавен()
{
charsource_str[] = 'www.linuxhint.com';

printf ('Преди да извикате функцията strcpy ():нн');
printf ('TИзточник Низ = %sн',source_str);

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

strcpy ('destination_str',source_str);

printf ('След изпълнение на функцията strcpy ():нн');
printf ('TИзточник Низ = %sн',source_str);

връщане 0;
}

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

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

#включва
char *strcpy_user_defined(char *дестинация, const char *src);

/ * Дефинирана от потребителя версия на функцията strcpy () */
char *strcpy_user_defined(char *дестинация, const char *src)
{
char *dest_backup=дестинация;

докато(*src! = ' 0') /* Итерация, докато се намери „ 0“.*/
{
*дестинация= *src; / * Копиране на източник char до местоназначение */
src++; / * Увеличаване на указателя на източника */
дестинация++; / * Увеличаване на указателя за местоназначение */
}

*дестинация= ' 0'; /* Вмъкнете изрично „ 0“ в местоназначението*/

връщанеdest_backup;
}

intглавен()
{
charsource_str[] = 'www.linuxhint.com';
chardestination_str[30];

printf („Преди да извикате функция за копиране на дефиниран от потребителя низ:нн');
printf ('TИзточник Низ = %sн',source_str);
printf ('TДестинационен низ = %sнн',destination_str);

/ * Извикване на дефинирана от потребителя функция за копиране на низ */
strcpy_user_defined(destination_str,source_str);

printf ('След изпълнение на дефинирана от потребителя функция за копиране на низ:нн');
printf ('TИзточник Низ = %sн',source_str);
printf ('TДестинационен низ = %sнн',destination_str);

връщане 0;
}

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

Сега, в тази примерна програма, ще оптимизираме дефинираната от потребителя версия на strcpy ().

#включва
char *strcpy_user_defined(char *дестинация, const char *src);


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

докато(*дестинация++ = *src++)
;

връщанеdest_backup;
}

intглавен()
{
charsource_str[] = 'www.linuxhint.com';
chardestination_str[30];

printf („Преди да извикате функция за копиране на дефиниран от потребителя низ:нн');
printf ('TИзточник Низ = %sн',source_str);
printf ('TДестинационен низ = %sнн',destination_str);

/ * Извикване на дефинирана от потребителя функция за копиране на низ */
strcpy_user_defined(destination_str,source_str);

printf ('След изпълнение на дефинирана от потребителя функция за копиране на низ:нн');
printf ('TИзточник Низ = %sн',source_str);
printf ('TДестинационен низ = %sнн',destination_str);

връщане 0;
}

Заключение :

Функцията strcpy () е много популярна и удобна библиотечна функция за извършване на операцията за копиране на низ в езика за програмиране C. Това се използва главно за копиране на низ от едно място на друго. Искаме обаче да повторим факта, че функцията strcpy () не извършва проверка на границите за целевия масив, което може да доведе до сериозна грешка в софтуера, ако бъде пренебрегната. Винаги е отговорност на програмиста да се увери, че целевият масив има достатъчно място за задържане на всички символи от изходния низ, включително символа NULL.