Programowanie C

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() jest bardzo popularną funkcją z biblioteki standardowej do wykonywania operacji kopiowania ciągów znaków w języku programowania C. Istnieje kilka standardowych plików nagłówkowych w języku programowania C do wykonywania standardowych operacji. „Struna.h” jest jednym z takich plików nagłówkowych, który udostępnia kilka standardowych funkcji bibliotecznych do wykonywania operacji na ciągach znaków. Funkcja „strcpy()” jest jedną z funkcji bibliotecznych udostępnianych przez „string.h”.

Składnia:

char* strcpy (char* lokalizacja_docelowa, const char* ciąg_źródłowy);

Zrozumienie strcpy():

Jedynym celem funkcji strcpy() jest skopiowanie ciągu znaków ze źródła do miejsca docelowego. Teraz spójrzmy na powyższą składnię funkcji strcpy(). Funkcja strcpy() może przyjmować dwa parametry -

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

Ważnym punktem, na który należy zwrócić uwagę, jest to, że funkcja strcpy() nie dołącza ciągu źródłowego do ciągu docelowego. Zamiast tego zastępuje zawartość miejsca docelowego zawartością ciągu ź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, za to całkowicie odpowiada programista.

Przykłady:

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

  1. strcpy() — normalne działanie (przykład1.do)
  2. strcpy() — Przypadek-1 (przykład2.do)
  3. strcpy() - Przypadek-2 (przykład3.do)
  4. strcpy() - Przypadek-3 (przykład4.do)
  5. strcpy() — wersja zdefiniowana przez użytkownika (przykład5.do)
  6. strcpy() — zoptymalizowana wersja zdefiniowana przez użytkownika (przykład6.do)

strcpy() — normalne działanie (przykład1.do):

Ten przykładowy program pokazuje, jak wykonać normalną operację kopiowania ciągów 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]; ), co jest większe niż długość ciągu źródłowego (długość wynosi 18, w tym znak NULL), tak aby miejsce docelowe mogło pomieścić wszystkie znaki z ciągu ciąg źródłowy.

#zawierać
#zawierać
int main()

char source_str[] = "www.linuxhint.pl";
char destination_str[30];
printf("Przed wywołaniem funkcji strcpy() : \n\n");
printf("\tSource String = %s\n", source_str);
printf("\tCiąg przeznaczenia = %s\n\n", cel_str);
strcpy(str_docelowy, str_źródłowy);
printf("Po wykonaniu funkcji strcpy() : \n\n");
printf("\tSource String = %s\n", source_str);
printf("\tCiąg przeznaczenia = %s\n\n", cel_str);
zwróć 0;

strcpy() — Przypadek-1 (przykład2.do):

Zamiarem tego przykładowego programu jest jasne wyjaśnienie co się dzieje, 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 spacji/bajtów, aby pomieścić wszystkie znaki (w tym znak NULL) z ciągu źródłowego. Dwie rzeczy, o których zawsze powinieneś pamiętać:

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

Spójrzmy na przykładowy program. Zadeklarowaliśmy source_str i zainicjalizowaliśmy je na „www.linuxhint.com”, która zajmie 18 bajtów w pamięci do przechowywania, w tym znak Null na końcu ciągu. Następnie zadeklarowaliśmy kolejną tablicę znaków i.mi. destination_str o rozmiarze 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ższych danych wyjściowych widzimy, że strcpy() w ogóle nie narzekał. W takim przypadku funkcja strcpy() rozpocznie kopiowanie znaku z ciągu źródłowego (do momentu znalezienia znaku NULL w ciągu źródłowym) do adresu docelowego (nawet jeśli granica docelowa przekracza). Oznacza to, że funkcja strcpy() nie sprawdza granic dla tablicy docelowej. Ostatecznie funkcja strcpy() nadpisze adresy pamięci, które nie są przydzielone do tablicy docelowej. Dlatego funkcja strcpy() spowoduje nadpisanie lokalizacji pamięci, które mogą być przydzielone innej zmiennej.

W tym przykładzie widzimy z poniższych danych wyjściowych, że funkcja strcpy() nadpisuje sam ciąg źródłowy. Programiści powinni zawsze uważać na takie zachowanie.

#zawierać
#zawierać
int main()

char source_str[] = "www.linuxhint.pl";
znak cel_str[5];
printf("Przed wywołaniem funkcji strcpy() : \n\n");
printf("\tSource String = %s\n", source_str);
printf("\tCiąg przeznaczenia = %s\n\n", cel_str);
strcpy(str_docelowy, str_źródłowy);
printf("Po wykonaniu funkcji strcpy() : \n\n");
printf("\tSource String = %s\n", source_str);
printf("\tCiąg przeznaczenia = %s\n\n", cel_str);
//printf("Adres źródłowy = %u (0x%x)\n", &source_str[0], &source_str[0]);
//printf("Adres docelowy = %u (0x%x)\n", &destination_str[0], &destination_str[0]);
zwróć 0;

strcpy() - Przypadek-2 (przykład3.do):

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

  • source_str na „www.linuxhint.pl” [rozmiar = 17+1 = 18]
  • destination_str do „I_AM_A_DESTINATION_STRING” [rozmiar = 25+1 = 26]

Funkcja strcpy() skopiuje wszystkie 17 znaków i znak NULL z ciągu źródłowego do ciągu docelowego. Ale nie zastąpi/zmieni pozostałych bajtów (Bajt 19 na 26, oparty na jednym) w tablicy docelowej. Wykorzystaliśmy pętlę for do iteracji po tablicy docelowej i wypisania całej tablicy, aby udowodnić, że bajty od 19 do 26 są niezmienione w tablicy docelowej. Dlatego widzimy ostatnie wyjście jako:

„www.linuxhint.com_STRING”.

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

char source_str[] = "www.linuxhint.pl";
char destination_str[26] = "I_AM_A_DESTINATION_STRING";
printf("Przed wywołaniem funkcji strcpy() : \n\n");
printf("\tSource String = %s\n", source_str);
printf("\tCiąg przeznaczenia = %s\n\n", cel_str);
strcpy(str_docelowy, str_źródłowy);
printf("Po wykonaniu funkcji strcpy() : \n\n");
printf("\tSource String = %s\n", source_str);
printf("\tCiąg przeznaczenia = %s\n\n", cel_str);
/* wypisz docelowy ciąg znaków za pomocą pętli for*/
printf("Wydrukuj docelowy łańcuch znak po znaku : \n\n");
printf("\tCiąg docelowy = ");
for(int i=0; i<25;i++)

printf("%c", destination_str[i]);

printf("\n\n");
zwróć 0;

strcpy() - Przypadek-3 (przykład4.do):

Rozważaliśmy ten program jako przykład pokazujący, że nigdy nie powinniśmy wywoływać strcpy() z literałem ciągu jako miejscem docelowym. Spowoduje to niezdefiniowane zachowanie i ostatecznie program się zawiesi.

#zawierać
#zawierać
int main()

char source_str[] = "www.linuxhint.pl";
printf("Przed wywołaniem funkcji strcpy() : \n\n");
printf("\tSource String = %s\n", source_str);
/* Nigdy nie wywołuj strcpy() z literałem ciągu jako miejscem docelowym.
Program się zawiesi.
*/
strcpy("str_docelowy", str_źródłowy);
printf("Po wykonaniu funkcji strcpy() : \n\n");
printf("\tSource String = %s\n", source_str);
zwróć 0;

strcpy() — wersja zdefiniowana przez użytkownika (przykład5.do):

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

#zawierać
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 = cel;
while(*src != '\0') /* Iteruj aż do znalezienia '\0'.*/

*docel = *źródło; /* Skopiuj znak źródłowy do miejsca docelowego */
src++; /* Zwiększ wskaźnik źródła */
dest++; /* Zwiększ wskaźnik celu */

*docel = '\0'; /* Wstaw jawnie '\0' w miejscu docelowym*/
zwróć dest_backup;

int main()

char source_str[] = "www.linuxhint.pl";
char destination_str[30];
printf("Przed wywołaniem funkcji kopiowania łańcucha zdefiniowanego przez użytkownika: \n\n");
printf("\tSource String = %s\n", source_str);
printf("\tCiąg przeznaczenia = %s\n\n", cel_str);
/* Wywołanie funkcji kopiowania napisów zdefiniowanej przez użytkownika */
strcpy_user_defined(str.docelowa, str.źródłowa);
printf("Po wykonaniu funkcji kopiowania łańcucha zdefiniowanego przez użytkownika : \n\n");
printf("\tSource String = %s\n", source_str);
printf("\tCiąg przeznaczenia = %s\n\n", cel_str);
zwróć 0;

strcpy() — zoptymalizowana wersja zdefiniowana przez użytkownika (przykład6.do):

Teraz w tym przykładowym programie zamierzamy zoptymalizować zdefiniowaną przez użytkownika wersję strcpy().

#zawierać
char * strcpy_user_defined(char *dest, const char * src);
/* Zoptymalizowana wersja funkcji strcpy() zdefiniowanej przez użytkownika */
char * strcpy_user_defined(char *dest, const char * src)

char * dest_backup = cel;
while(*dest++ = *src++)
;
zwróć dest_backup;

int main()

char source_str[] = "www.linuxhint.pl";
char destination_str[30];
printf("Przed wywołaniem funkcji kopiowania łańcucha zdefiniowanego przez użytkownika: \n\n");
printf("\tSource String = %s\n", source_str);
printf("\tCiąg przeznaczenia = %s\n\n", cel_str);
/* Wywołanie funkcji kopiowania napisów zdefiniowanej przez użytkownika */
strcpy_user_defined(str.docelowa, str.źródłowa);
printf("Po wykonaniu funkcji kopiowania łańcucha zdefiniowanego przez użytkownika : \n\n");
printf("\tSource String = %s\n", source_str);
printf("\tCiąg przeznaczenia = %s\n\n", cel_str);
zwróć 0;

Wniosek:

Funkcja strcpy() jest bardzo popularną i poręczną funkcją biblioteczną do wykonywania operacji kopiowania ciągów w języku programowania C C. Jest to używane głównie do kopiowania ciągu z jednej lokalizacji do drugiej. Chcemy jednak powtórzyć fakt, że funkcja strcpy() nie sprawdza granic dla tablicy docelowej, co może prowadzić do poważnego błędu oprogramowania, jeśli zostanie zignorowane. Zawsze obowiązkiem programisty jest upewnienie się, że tablica docelowa ma wystarczająco dużo miejsca, aby pomieścić wszystkie znaki z ciągu źródłowego, w tym znak NULL.

How to reverse Mouse and Touchpads scrolling direction in Windows 10
Mouse and Touchpads not only make computing easy but more efficient and less time-consuming. We cannot imagine a life without these devices, but still...
How to change Mouse pointer and cursor size, color & scheme on Windows 10
The mouse pointer and cursor in Windows 10 are very important aspects of the operating system. This can be said for other operating systems as well, s...
Gry Darmowe i otwarte silniki gier do tworzenia gier na Linuksa
Darmowe i otwarte silniki gier do tworzenia gier na Linuksa
Ten artykuł zawiera listę darmowych i otwartych silników gier, których można używać do tworzenia gier 2D i 3D w systemie Linux. Istnieje wiele takich ...