Jak używać Strcpy w języku C?

Jak używać Strcpy w języku C?
W tym artykule dowiemy się o funkcji strcpy () w języku programowania C. Funkcja strcpy () to bardzo popularna standardowa funkcja biblioteki do wykonywania operacji kopiowania ciągu w języku programowania C. Istnieje kilka standardowych plików nagłówka w języku programowania C do wykonywania standardowych operacji. „String.H ”jest jednym z takich plików nagłówka, które zapewnia kilka standardowych funkcji biblioteki do wykonywania operacji ciągu. Funkcja „strcpy ()” jest jedną z funkcji biblioteki dostarczonej przez „String.H".

Składnia:

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

Zrozumienie strcpy ():

Jedynym celem funkcji strcpy () jest kopiowanie ciągu od źródła do miejsca docelowego. Teraz pozwól nam spojrzeć na powyższą składnię funkcji strcpy (). Funkcja strcpy () jest w stanie zaakceptować dwa parametry -

  • Char * miejsce docelowe
  • Źródło const char *

Źródło jest tutaj stałe, aby zapewnić, że funkcja strcpy () nie może zmienić ciągu źródłowego. Funkcja strcpy () kopiuje wszystkie znaki (w tym znak zerowy na końcu łańcucha) od ciągu źródłowego do docelowego. Po zakończeniu operacji kopiowania od źródła do miejsca docelowego funkcja strcpy () zwraca adres miejsca docelowego z powrotem do funkcji dzwoniącego.

Ważnym punktem, do którego należy zauważyć, jest funkcja strcpy () nie dołącza ciąg źródłowego do ciągu docelowego. Raczej zastępuje zawartość miejsca docelowego treścią łańcucha źródłowego.

Ponadto funkcja strcpy () nie wykonuje żadnych kontroli, aby upewnić się, że rozmiar miejsca docelowego jest większy niż ciąg źródłowy, jest całkowicie odpowiedzialna za programista.

Przykłady:

Teraz zobaczymy kilka przykładów, aby zrozumieć funkcję strcpy ():

  1. strcpy () - normalna operacja (przykład1.C)
  2. strcpy () - case -1 (przykład2.C)
  3. strcpy () - case -2 (przykład3.C)
  4. strcpy () - case -3 (przykład4.C)
  5. strcpy () - Wersja zdefiniowana przez użytkownika (przykład5.C)
  6. strcpy () - Wersja zdefiniowana przez użytkownika zoptymalizowana (przykład6.C)

strcpy () - normalna operacja (przykład1.C):

Ten przykładowy program pokazuje, jak wykonać normalną operację kopiowania ciągu za pomocą funkcji strcpy () w języku programowania C. Należy pamiętać, że długość ciągu docelowego wynosi 30 (Char Destination_str [30];), który jest większy niż długość ciągu źródłowego (długość 18, w tym znak zerowy), dzięki czemu miejsce docelowe mogło pomieścić wszystkie znaki z String źródłowy.

#włączać
#włączać
int main ()

Char source_str [] = "www.Linuxhint.com ";
Char Destination_str [30];
printf („przed wywołaniem funkcji strcpy (): \ n \ n”);
printf ("\ tsource string = %s \ n", źródło_str);
printf ("\ tDestination String = %s \ n \ n", Destination_str);
strcpy (Destination_str, source_str);
printf („po wykonaniu funkcji strcpy (): \ n \ n”);
printf ("\ tsource string = %s \ n", źródło_str);
printf ("\ tDestination String = %s \ n \ n", Destination_str);
powrót 0;

strcpy () - case -1 (przykład2.C):

Celem tego przykładowego programu jest jasne wyjaśnienie, co dzieje się, gdy długość ciągu docelowego jest mniejsza niż długość ciągu źródłowego. W takich przypadkach lokalizacja docelowa nie będzie miała wystarczającej ilości przestrzeni/bajtów, aby pomieścić wszystkie znaki (w tym znak zerowy) z łańcucha źródłowego. Dwie rzeczy, zawsze należy pamiętać:

  1. Funkcja strcpy () nie sprawdzi, czy miejsce docelowe ma wystarczającą ilość miejsca.
  2. Może to być niebezpieczne w oprogramowaniu wbudowanym, ponieważ strcpy () zastąpi obszar pamięci poza granicą miejsca docelowego.

Spójrzmy na przykładowy program. Zadeklarowaliśmy źródło_str i zainicjowaliśmy go do „www.Linuxhint.com ”, który weźmie 18 bajtów w pamięci do przechowywania, w tym znak zerowy na końcu sznurka. Następnie zadeklarowaliśmy kolejną tablicę postaci I.mi. Destination_str o wielkości tylko 5. Tak więc Destination_str nie może pomieścić ciągu źródłowego o łącznym rozmiarze 18 bajtów.

Ale nadal wywołujemy funkcję strcpy (), aby skopiować ciąg źródłowy do ciągu docelowego. Z poniższego wyjścia widzimy, że strcpy () w ogóle nie narzekało. W tym przypadku funkcja strcpy () zacznie kopiować znak z łańcucha źródłowego (aż znajdzie znak zerowy w ciągu źródłowego) na adres docelowy (nawet jeśli granica docelowa przekracza). Oznacza to, że funkcja strcpy () nie wykonuje żadnego sprawdzania granic tablicy docelowej. Ostatecznie funkcja strcpy () zastąpi adresy pamięci, które nie są przydzielane do tablicy docelowej. Właśnie dlatego funkcja strcpy () skończy nadpisanie lokalizacji pamięci, które można przydzielić do innej zmiennej.

W tym przykładzie możemy zobaczyć z poniższego wyjścia, że ​​funkcja strcpy () zastąpi sam ciąg źródeł. Programiści powinni zawsze zachować ostrożność przy takim zachowaniu.

#włączać
#włączać
int main ()

Char source_str [] = "www.Linuxhint.com ";
Char Destination_str [5];
printf („przed wywołaniem funkcji strcpy (): \ n \ n”);
printf ("\ tsource string = %s \ n", źródło_str);
printf ("\ tDestination String = %s \ n \ n", Destination_str);
strcpy (Destination_str, source_str);
printf („po wykonaniu funkcji strcpy (): \ n \ n”);
printf ("\ tsource string = %s \ n", źródło_str);
printf ("\ tDestination String = %s \ n \ n", Destination_str);
// printf ("
// printf ("Adres docelowy = %u (0x %x) \ n" i Destination_Str [0] i Destination_Str [0]);
powrót 0;

strcpy () - case -2 (przykład3.C):

Ten program ilustruje sytuację, gdy rozmiar ciągu docelowego jest większy niż rozmiar ciągu źródłowego i ciąg docelowy jest już zainicjowany z pewną wartością. W tym przykładzie zainicjowaliśmy:

  • źródło_str do „www.Linuxhint.com ”[rozmiar = 17+1 = 18]
  • Destination_str to „i_am_a_destination_string” [rozmiar = 25+1 = 26]

Funkcja strcpy () skopiuje wszystkie 17 znaków i znak zerowy z ciągu źródłowego do ciągu docelowego. Ale nie zastąpi/nie zmieni pozostałych bajtów (BYTE 19–26, jeden na podstawie tablicy docelowej. Wykorzystaliśmy pętlę do iteracji nad tablicą docelową i wydrukowania całej tablicy, aby udowodnić, że bajty-19 do 26 pozostają niezmienione w tablicy docelowej. Dlatego postrzegamy ostatnie dane wyjściowe jako:

„Www.Linuxhint.com_string ”.

#włączać
#włączać
/* Ten program ilustruje sytuację, gdy:
Rozmiar ciągów docelowych> Rozmiar ciągów źródłowych
i wykonujemy funkcję strcpy (), aby skopiować
String źródłowy do miejsca docelowego.
Uwaga: rozmiar ciągu docelowego powinien zawsze
być większe lub równe łańcuchowi źródłowi.
*/
int main ()

Char source_str [] = "www.Linuxhint.com ";
Char Destination_str [26] = "i_am_a_destination_string";
printf („przed wywołaniem funkcji strcpy (): \ n \ n”);
printf ("\ tsource string = %s \ n", źródło_str);
printf ("\ tDestination String = %s \ n \ n", Destination_str);
strcpy (Destination_str, source_str);
printf („po wykonaniu funkcji strcpy (): \ n \ n”);
printf ("\ tsource string = %s \ n", źródło_str);
printf ("\ tDestination String = %s \ n \ n", Destination_str);
/* Drukuj ciąg docelowy za pomocą pętli*/
printf („Wydrukuj ciąg docelowy char by char: \ n \ n”);
printf ("\ tDestination String =");
dla (int i = 0; i<25;i++)

printf („%C”, Destination_Str [i]);

printf ("\ n \ n");
powrót 0;

strcpy () - case -3 (przykład4.C):

Uważaliśmy ten program za przykład, aby pokazać, że nigdy nie powinniśmy nazywać strcpy () z dosłownym ciągiem jako miejscem docelowym. Spowoduje to niezdefiniowane zachowanie i ostatecznie program zawiedzie.

#włączać
#włączać
int main ()

Char source_str [] = "www.Linuxhint.com ";
printf („przed wywołaniem funkcji strcpy (): \ n \ n”);
printf ("\ tsource string = %s \ n", źródło_str);
/* Nigdy nie wywołuje strcpy () z literacją String jako docelową.
Program się zawiedzie.
*/
strcpy („Destination_str”, source_str);
printf („po wykonaniu funkcji strcpy (): \ n \ n”);
printf ("\ tsource string = %s \ n", źródło_str);
powrót 0;

strcpy () - Wersja zdefiniowana przez użytkownika (przykład5.C):

W tym przykładowym programie pokazaliśmy, jak napisać definiowaną przez użytkownika wersję funkcji strcpy ().

#włączać
char * strcpy_user_defined (char * dest, const char * src);
/ * Zdefiniowana przez użytkownika wersja funkcji strcpy () */
char * strcpy_user_defined (char * dest, const char * src)

char * dest_backup = dest;
while (*src != '\ 0') /* iteruj do znalezienia '\ 0'.*/

*dest = *src; / * Kopiuj Źródło docelowe do miejsca docelowego */
src ++; / * Wskaźnik źródła przyrostu */
dest ++; / * Wskaźnik docelowego przyrostu */

*dest = '\ 0'; /* Włóż jawnie „\ 0” w miejscu docelowym*/
return dest_backup;

int main ()

Char source_str [] = "www.Linuxhint.com ";
Char Destination_str [30];
printf („Przed wywołaniem funkcji String Cyfrined Użytkownik: \ n \ n”);
printf ("\ tsource string = %s \ n", źródło_str);
printf ("\ tDestination String = %s \ n \ n", Destination_str);
/ * Wywoływanie definiowanej przez użytkownika funkcja kopiowania */
strcpy_user_defined (destiner_str, source_str);
printf („Po wykonaniu funkcji kopiowania ciągu zdefiniowanego przez użytkownika: \ n \ n”);
printf ("\ tsource string = %s \ n", źródło_str);
printf ("\ tDestination String = %s \ n \ n", Destination_str);
powrót 0;

strcpy () - Wersja zdefiniowana przez użytkownika zoptymalizowana (przykład6.C):

Teraz, w tym przykładowym programie, zoptymalizujemy zdefiniowaną przez użytkownika wersję strcpy ().

#włączać
char * strcpy_user_defined (char * dest, const char * src);
/ * Zoptymalizowana wersja definiowanej przez użytkownika funkcję strcpy () */
char * strcpy_user_defined (char * dest, const char * src)

char * dest_backup = dest;
while ( *dest ++ = *src ++)
;
return dest_backup;

int main ()

Char source_str [] = "www.Linuxhint.com ";
Char Destination_str [30];
printf („Przed wywołaniem funkcji String Cyfrined Użytkownik: \ n \ n”);
printf ("\ tsource string = %s \ n", źródło_str);
printf ("\ tDestination String = %s \ n \ n", Destination_str);
/ * Wywoływanie definiowanej przez użytkownika funkcja kopiowania */
strcpy_user_defined (destiner_str, source_str);
printf („Po wykonaniu funkcji kopiowania ciągu zdefiniowanego przez użytkownika: \ n \ n”);
printf ("\ tsource string = %s \ n", źródło_str);
printf ("\ tDestination String = %s \ n \ n", Destination_str);
powrót 0;

Wniosek:

Funkcja strcpy () jest bardzo popularną i poręczną funkcją biblioteki do wykonywania operacji kopiowania ciągów w języku programowania C. Służy to głównie do kopiowania ciągu z jednego miejsca do innej lokalizacji. Chcemy jednak powtórzyć fakt, że funkcja strcpy () nie wykonuje sprawdzania granic tablicy docelowej, co może prowadzić do poważnego błędu oprogramowania, jeśli jest zignorowana. Zawsze obowiązkiem programisty jest upewnienie się, że tablica docelowa ma wystarczająco dużo miejsca, aby pomieścić wszystkie znaki z łańcucha źródłowego, w tym znak zerowy.