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

How Use Strcpy C Language



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

Синтакса:

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

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

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







  • цхар * одредиште
  • цонст цхар * извор

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



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



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





Примери:

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

  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;и++)
{
принтф ('% ц',дестинатион_стр[и]);
}
принтф (' н н');

повратак 0;
}

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

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

#инцлуде
#инцлуде

интглавни()
{
цхарсоурце_стр[] = 'ввв.линукхинт.цом';

принтф ('Пре позивања функције стрцпи (): н н');
принтф (' тИзворни низ = %с н',соурце_стр);

/* Никада не позивајте стрцпи () са стринг литерал -ом као одредиштем.
Програм ће се срушити.
* /

стрцпи ('дестинатион_стр',соурце_стр);

принтф ('Након извршавања функције стрцпи (): н н');
принтф (' тИзворни низ = %с н',соурце_стр);

повратак 0;
}

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

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

#инцлуде
цхар *стрцпи_усер_дефинед(цхар *дест, цонст цхар *срц);

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

док(*срц! = ' 0') /* Понављајте док се не пронађе ' 0'.*/
{
*дест= *срц; / * Копирајте изворни знак на одредиште */
срц++; / * Повећање показивача извора */
дест++; / * Повећајте показивач одредишта */
}

*дест= ' 0'; /* Уметните „ 0“ у одредиште изричито*/

повратакдест_бацкуп;
}

интглавни()
{
цхарсоурце_стр[] = 'ввв.линукхинт.цом';
цхардестинатион_стр[30];

принтф ('Пре него што позовете кориснички дефинисану функцију копирања низа: н н');
принтф (' тИзворни низ = %с н',соурце_стр);
принтф (' тОдредишни низ = %с н н',дестинатион_стр);

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

принтф ('Након извршавања кориснички дефинисане функције копирања низа: н н');
принтф (' тИзворни низ = %с н',соурце_стр);
принтф (' тОдредишни низ = %с н н',дестинатион_стр);

повратак 0;
}

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

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

#инцлуде
цхар *стрцпи_усер_дефинед(цхар *дест, цонст цхар *срц);


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

док(*дест++ = *срц++)
;

повратакдест_бацкуп;
}

интглавни()
{
цхарсоурце_стр[] = 'ввв.линукхинт.цом';
цхардестинатион_стр[30];

принтф ('Пре него што позовете кориснички дефинисану функцију копирања низа: н н');
принтф (' тИзворни низ = %с н',соурце_стр);
принтф (' тОдредишни низ = %с н н',дестинатион_стр);

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

принтф ('Након извршавања кориснички дефинисане функције копирања низа: н н');
принтф (' тИзворни низ = %с н',соурце_стр);
принтф (' тОдредишни низ = %с н н',дестинатион_стр);

повратак 0;
}

Закључак :

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