Ц Програмирање

Како се користи Стрцпи () на језику Ц?

Како се користи Стрцпи () на језику Ц?
У овом чланку ћемо сазнати више о функцији стрцпи () у програмском језику Ц. Функција стрцпи () је врло популарна функција стандардне библиотеке за извођење операције копирања низа у програмском језику Ц. Постоји неколико стандардних датотека заглавља у програмском језику Ц за обављање стандардних операција. Стринг.х ”је једна од таквих датотека заглавља која пружа неколико стандардних функција библиотеке за извођење операција низа. Функција „стрцпи ()“ једна је од функција библиотеке коју пружа „стринг.х ”.

Синтакса:

цхар * стрцпи (цхар * одредиште_локација, цонст цхар * соурце_стринг);

Разумевање стрцпи ():

Једина сврха функције стрцпи () је копирање низа од извора до одредишта. Сада, дозволите нам да погледамо горњу синтаксу функције стрцпи (). Функција стрцпи () је способна да прихвати два параметра -

Извор је овде константа како би се осигурало да функција стрцпи () не може променити изворни низ. Функција стрцпи () копира све знакове (укључујући НУЛЛ знак на крају низа) из изворног низа на одредиште. Једном када је операција копирања завршена од извора до одредишта, функција стрцпи () враћа адресу одредишта назад у функцију позиваоца.

Овде је важно приметити да функција стрцпи () не додаје изворни низ одредишном низу. Уместо тога, садржај одредишта замењује садржајем изворног низа.

Такође, функција стрцпи () не врши никакве провере како би се осигурало да је величина одредишта већа од изворног низа, у потпуности је одговорност програмера.

Примери:

Сада ћемо видети неколико примера за разумевање функције стрцпи ():

  1. стрцпи () - Уобичајени рад (пример1.ц)
  2. стрцпи () - Случај-1 (пример2.ц)
  3. стрцпи () - Случај-2 (пример3.ц)
  4. стрцпи () - Случај-3 (пример4.ц)
  5. стрцпи () - Кориснички дефинисана верзија (пример5.ц)
  6. стрцпи () - Кориснички дефинисана верзија оптимизована (пример6.ц)

стрцпи () - Уобичајени рад (пример1.ц):

Овај пример програма показује како се изводи нормална операција копирања низа помоћу функције стрцпи () у програмском језику Ц. Имајте на уму да је дужина одредишног низа 30 (цхар дестинатион_стр [30];), што је веће од дужине изворног низа (дужина је 18 укључујући НУЛЛ знак), тако да одредиште може да прими све знакове из изворни низ.

#инцлуде
#инцлуде
инт маин ()

цхар соурце_стр [] = "ввв.линукхинт.цом ";
цхар одредиште_стр [30];
принтф ("Пре позивања функције стрцпи (): \ н \ н");
принтф ("\ тИзворни извор =% с \ н", извор_стр);
принтф ("\ тОдредишни низ =% с \ н \ н", одредишни_стр);
стрцпи (одредиште_стр, извор_стр);
принтф ("Након извршавања функције стрцпи (): \ н \ н");
принтф ("\ тИзвор извора =% с \ н", извор_стр);
принтф ("\ тОдредишни низ =% с \ н \ н", одредишни_стр);
ретурн 0;

стрцпи () - Случај-1 (пример2.ц):

Намера овог примера програма је да јасно објасни шта се дешава када је дужина одредишног низа мања од дужине изворног низа. У таквим случајевима одредишна локација неће имати довољно простора / бајтова за смештај свих знакова (укључујући НУЛЛ знак) из изворног низа. Увек треба имати на уму две ствари:

  1. Функција стрцпи () неће проверити да ли одредиште има довољно простора.
  2. То може бити опасно у уграђеном софтверу јер ће стрцпи () заменити меморијско подручје изван границе одредишта.

Погледајмо пример програма. Прогласили смо соурце_стр и иницијализирали га у „ввв.линукхинт.цом ”, који ће требати 18 бајтова у меморији, укључујући Нулл знак на крају низа. Затим смо прогласили још један низ знакова и.е. дестинатион_стр величине само 5. Дакле, одредиште_стр не може да садржи изворни низ укупне величине 18 бајтова.

Али, ипак, позивамо функцију стрцпи () да копира изворни низ у одредишни низ. Из доњег резултата можемо видети да се стрцпи () уопште није жалио. У овом случају, функција стрцпи () започет ће копирање знака из изворног низа (све док не пронађе НУЛЛ знак у изворном низу) на одредишну адресу (иако граница одредишта прелази). То значи да функција стрцпи () не врши провјеру граница за одредишни низ. На крају ће функција стрцпи () пребрисати меморијске адресе које нису додељене одредишном низу. Због тога ће функција стрцпи () на крају пребрисати меморијске локације које би могле бити додељене другој променљивој.

У овом примеру из доњег резултата можемо видети да функција стрцпи () преписује сам изворни низ. Програмери би увек требали бити опрезни са таквим понашањем.

#инцлуде
#инцлуде
инт маин ()

цхар соурце_стр [] = "ввв.линукхинт.цом ";
цхар одредиште_стр [5];
принтф ("Пре позивања функције стрцпи (): \ н \ н");
принтф ("\ тИзвор извора =% с \ н", извор_стр);
принтф ("\ тОдредишни низ =% с \ н \ н", одредишни_стр);
стрцпи (одредиште_стр, извор_стр);
принтф ("Након извршавања функције стрцпи (): \ н \ н");
принтф ("\ тИзвор извора =% с \ н", извор_стр);
принтф ("\ тОдредишни низ =% с \ н \ н", одредишни_стр);
// принтф ("Адреса извора =% у (0к% к) \ н", & соурце_стр [0], & соурце_стр [0]);
// принтф ("Адреса одредишта =% у (0к% к) \ н", & одредиште_стр [0], & одредиште_стр [0]);
ретурн 0;

стрцпи () - Случај-2 (пример3.ц):

Овај програм илуструје ситуацију када је величина одредишног низа већа од величине изворног низа, а одредишни низ је већ иницијализован са неком вредношћу. У овом примеру смо иницијализовали:

  • соурце_стр на „ввв.линукхинт.цом ”[величина = 17 + 1 = 18]
  • одредиште_стр до “И_АМ_А_ДЕСТИНАТИОН_СТРИНГ” [величина = 25 + 1 = 26]

Функција стрцпи () ће копирати свих 17 знакова и НУЛЛ знак из изворног низа у одредишни низ. Али, неће заменити / променити преостале бајтове (бајт 19 до 26, један заснован) у одредишном низу. Петљу фор користили смо за итерацију преко одредишног низа и штампање читавог низа да бисмо доказали да су бајтови-19 до 26 непромењени у одредишном низу. Због тога последњи излаз видимо као:

“Ввв.линукхинт.цом_СТРИНГ ”.

#инцлуде
#инцлуде
/ * Овај програм илуструје ситуацију када:
одредишна величина низа> величина изворног низа
и извршавамо функцију стрцпи () за копирање
изворни низ до одредишта.
Напомена: Одредишна величина низа увек треба
бити већи или једнак изворном низу.
* /
инт маин ()

цхар соурце_стр [] = "ввв.линукхинт.цом ";
цхар одредиште_стр [26] = "И_АМ_А_ДЕСТИНАТИОН_СТРИНГ";
принтф ("Пре позивања функције стрцпи (): \ н \ н");
принтф ("\ тИзвор извора =% с \ н", извор_стр);
принтф ("\ тОдредишни низ =% с \ н \ н", одредишни_стр);
стрцпи (одредиште_стр, извор_стр);
принтф ("Након извршавања функције стрцпи (): \ н \ н");
принтф ("\ тИзвор извора =% с \ н", извор_стр);
принтф ("\ тОдредишни низ =% с \ н \ н", одредишни_стр);
/ * испис одредишног низа помоћу фор лооп * /
принтф ("Одштампај одредишни низ цхар цхар: \ н \ н");
принтф ("\ тДестинатион Стринг =");
за (инт и = 0; и<25;i++)

принтф ("% ц", одредиште_стр [и]);

принтф ("\ н \ н");
ретурн 0;

стрцпи () - Случај-3 (пример4.ц):

Размотрили смо овај програм као пример да покажемо да никада не бисмо требали позивати стрцпи () са стринг-ом као одредиштем. То ће проузроковати недефинисано понашање и на крају ће се програм срушити.

#инцлуде
#инцлуде
инт маин ()

цхар соурце_стр [] = "ввв.линукхинт.цом ";
принтф ("Пре позивања функције стрцпи (): \ н \ н");
принтф ("\ тИзвор извора =% с \ н", извор_стр);
/ * Никада не зовите стрцпи () са стринг литералом као одредиштем.
Програм ће се срушити.
* /
стрцпи ("одредиште_стр", извор_стр);
принтф ("Након извршавања функције стрцпи (): \ н \ н");
принтф ("\ тИзвор извора =% с \ н", извор_стр);
ретурн 0;

стрцпи () - Кориснички дефинисана верзија (пример5.ц):

У овом примеру програма смо показали како да напишем кориснички дефинисану верзију функције стрцпи ().

#инцлуде
цхар * стрцпи_усер_дефинед (цхар * дест, цонст цхар * срц);
/ * Кориснички дефинисана верзија функције стрцпи () * /
цхар * стрцпи_усер_дефинед (цхар * дест, цонст цхар * срц)

цхар * дест_бацкуп = дест;
док (* срц != '\ 0') / * Итерирајте док се не нађе '\ 0'.* /

* дест = * срц; / * Копирај изворни знак на одредиште * /
срц ++; / * Повећај показивач извора * /
дест ++; / * Повећај одредишни показивач * /

* дест = '\ 0'; / * Експлицитно убаците '\ 0' у одредиште * /
ретурн дест_бацкуп;

инт маин ()

цхар соурце_стр [] = "ввв.линукхинт.цом ";
цхар одредиште_стр [30];
принтф ("Пре позивања функције дефинисане корисничким копирањем низа: \ н \ н");
принтф ("\ тИзвор извора =% с \ н", извор_стр);
принтф ("\ тОдредишни низ =% с \ н \ н", одредишни_стр);
/ * Позивање кориснички дефинисане функције копирања низа * /
стрцпи_усер_дефинед (одредиште_стр, извор_стр);
принтф ("Након извршавања корисничке функције копирања низа: \ н \ н");
принтф ("\ тИзвор извора =% с \ н", извор_стр);
принтф ("\ тОдредишни низ =% с \ н \ н", одредишни_стр);
ретурн 0;

стрцпи () - Кориснички дефинисана верзија оптимизована (пример6.ц):

Сада ћемо у овом примеру програма оптимизирати кориснички дефинисану верзију стрцпи ().

#инцлуде
цхар * стрцпи_усер_дефинед (цхар * дест, цонст цхар * срц);
/ * Оптимизована верзија кориснички дефинисане функције стрцпи () * /
цхар * стрцпи_усер_дефинед (цхар * дест, цонст цхар * срц)

цхар * дест_бацкуп = дест;
док (* дест ++ = * срц ++)
;
ретурн дест_бацкуп;

инт маин ()

цхар соурце_стр [] = "ввв.линукхинт.цом ";
цхар одредиште_стр [30];
принтф ("Пре него што позовете кориснички дефинисану функцију копирања низа: \ н \ н");
принтф ("\ тИзвор извора =% с \ н", извор_стр);
принтф ("\ тОдредишни низ =% с \ н \ н", одредишни_стр);
/ * Позивање кориснички дефинисане функције копирања низа * /
стрцпи_усер_дефинед (одредиште_стр, извор_стр);
принтф ("Након извршавања корисничке функције копирања низа: \ н \ н");
принтф ("\ тИзвор извора =% с \ н", извор_стр);
принтф ("\ тОдредишни низ =% с \ н \ н", одредишни_стр);
ретурн 0;

Закључак:

Функција стрцпи () је веома популарна и практична функција библиотеке за извођење операције копирања низа у програмском језику Ц. Ово се углавном користи за копирање низа са једне локације на другу. Међутим, желимо да поновимо чињеницу да функција стрцпи () не врши контролу граница за одредишни низ, што би могло довести до озбиљне софтверске грешке ако се занемари. Програмер је увек одговоран да осигура да одредишни низ има довољно простора да садржи све знакове из изворног низа, укључујући НУЛЛ знак.

Најбољи Линук Дистрос за игре у 2021
Линук оперативни систем далеко је превалио свој изворни, једноставни изглед заснован на серверима. Овај ОС се изузетно побољшао последњих година и сад...
Како снимити и стримовати своју играћу сесију на Линук-у
У прошлости се играње игара сматрало само хобијем, али с временом је играчка индустрија забележила огроман раст у погледу технологије и броја играча. ...
Најбоље игре за ручно праћење
Оцулус Куест је недавно представио сјајну идеју ручног праћења без контролера. Са све већим бројем игара и активности које извршавају подршку формално...