C Програмиране

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

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

Синтаксис:

char * strcpy (char * местоположение_целта, const char * source_string);

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

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

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

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

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

Примери:

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

  1. strcpy () - Нормална работа (пример1.° С)
  2. strcpy () - Случай-1 (пример2.° С)
  3. strcpy () - Случай-2 (пример3.° С)
  4. strcpy () - дело-3 (пример4.° С)
  5. strcpy () - Дефинирана от потребителя версия (пример5.° С)
  6. strcpy () - Оптимизирана от потребителя версия (пример6.° С)

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

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

#include
#include
int main ()

char source_str [] = "www.linuxhint.com ";
char dest_str [30];
printf ("Преди да извикате функцията strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tНационален низ =% s \ n \ n", дестинация_str);
strcpy (дестинация_str, източник_str);
printf ("След изпълнение на функцията strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tНазначение низ =% s \ n \ n", дестинация_str);
връщане 0;

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

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

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

Нека разгледаме примерната програма. Декларирахме source_str и го инициализирахме на „www.linuxhint.com ”, което ще отнеме 18 байта в паметта, включително символа Null в края на низа. След това декларирахме друг масив от символи i.д. destination_str с размер само 5. Така че, destination_str не може да побере изходния низ с общ размер 18 байта.

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

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

#include
#include
int main ()

char source_str [] = "www.linuxhint.com ";
char dest_str [5];
printf ("Преди да извикате функцията strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tНационален низ =% s \ n \ n", дестинация_str);
strcpy (дестинация_str, източник_str);
printf ("След изпълнение на функцията strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tНационален низ =% s \ n \ n", дестинация_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.° С):

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

  • source_str към „www.linuxhint.com ”[размер = 17 + 1 = 18]
  • destination_str до “I_AM_A_DESTINATION_STRING” [размер = 25 + 1 = 26]

Функцията strcpy () ще копира всичките 17 знака и символа NULL от изходния низ в целевия низ. Но няма да замени / промени останалите байтове (байт 19 до 26, базиран на един) в целевия масив. Използвахме цикъл for, за да прегледаме целевия масив и да отпечатаме целия масив, за да докажем, че байтовете от 19 до 26 са непроменени в целевия масив. Ето защо виждаме последния изход като:

„Www.linuxhint.com_STRING ”.

#include
#include
/ * Тази програма илюстрира ситуацията, когато:
целеви размер на низа> размер на изходния низ
и изпълняваме функцията strcpy (), за да копираме
низ източник до местоназначение.
Забележка: Целевият размер на низа трябва винаги
да бъде по-голямо или равно на изходния низ.
* /
int main ()

char source_str [] = "www.linuxhint.com ";
char destination_str [26] = "I_AM_A_DESTINATION_STRING";
printf ("Преди да извикате функцията strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tНационален низ =% s \ n \ n", дестинация_str);
strcpy (дестинация_str, източник_str);
printf ("След изпълнение на функцията strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tНационален низ =% s \ n \ n", дестинация_str);
/ * отпечатване на дестинация низ с помощта на цикъл * /
printf ("Печат на целевия низ char по char: \ n \ n");
printf ("\ tDestination String =");
за (int i = 0; i<25;i++)

printf ("% c", дестинация_str [i]);

printf ("\ n \ n");
връщане 0;

strcpy () - дело-3 (пример4.° С):

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

#include
#include
int main ()

char source_str [] = "www.linuxhint.com ";
printf ("Преди да извикате функцията strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
/ * Никога не извиквайте strcpy () с низ литерал като дестинация.
Програмата ще се срине.
* /
strcpy ("destination_str", source_str);
printf ("След изпълнение на функцията strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
връщане 0;

strcpy () - Дефинирана от потребителя версия (пример5.° С):

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

#include
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; / * Копиране на източника char до местоназначението * /
src ++; / * Увеличаване на указателя на източника * /
dest ++; / * Увеличаване на указателя за дестинация * /

* dest = '\ 0'; / * Поставете изрично '\ 0' в дестинацията * /
връщане dest_backup;

int main ()

char source_str [] = "www.linuxhint.com ";
char dest_str [30];
printf ("Преди извикване на дефинирана от потребителя функция за копиране на низове: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tНационален низ =% s \ n \ n", дестинация_str);
/ * Извикване на дефинирана от потребителя функция за копиране на низове * /
strcpy_user_defined (destination_str, source_str);
printf ("След изпълнение на дефинирана от потребителя функция за копиране на низове: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tНационален низ =% s \ n \ n", дестинация_str);
връщане 0;

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

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

#include
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 main ()

char source_str [] = "www.linuxhint.com ";
char dest_str [30];
printf ("Преди извикване на дефинирана от потребителя функция за копиране на низове: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tНационален низ =% s \ n \ n", дестинация_str);
/ * Извикване на дефинирана от потребителя функция за копиране на низове * /
strcpy_user_defined (destination_str, source_str);
printf ("След изпълнение на дефинирана от потребителя функция за копиране на низове: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tНационален низ =% s \ n \ n", дестинация_str);
връщане 0;

Заключение:

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

Как да увеличите FPS в Linux?
FPS означава Кадри в секунда. Задачата на FPS е да измерва честотата на кадрите при възпроизвеждане на видео или игрални изпълнения. С прости думи бро...
Топ Oculus App Lab Games
Ако сте собственик на слушалки на Oculus, тогава трябва да знаете за странично зареждане. Sideloading е процесът на инсталиране на несъхранявано съдър...
Топ 10 игри за игра на Ubuntu
Платформата на Windows е една от доминиращите платформи за игри поради огромния процент игри, които се развиват днес, за да поддържат Windows. Може ли...