strlen, strcpy, strcat
Podstawowe funkcje obsługi napisów
strlen, strcpy, strcat to bezpłatna lekcja C Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C Academy zawiera 4 lekcji w sumie.
Napisy w C
W języku C napis to po prostu tablica elementów typu char, zakończona specjalnym znakiem końca napisu '\0'.
Funkcje z pliku <string.h> korzystają z tego znaku, aby wiedzieć, gdzie kończy się napis. Bez niego odczytują dane poza końcem tablicy.
#include <stdio.h>
int main(void) {
char name[] = "Alice";
printf("%s\n", name);
printf("Bytes used: %lu\n", sizeof(name));
return 0;
}Dołączanie string.h
Aby używać funkcji do obsługi napisów, należy dołączyć nagłówek:
#include <string.h>
Udostępnia on funkcje strlen, strcpy, strcat, strcmp i inne.
#include <stdio.h>
#include <string.h>
int main(void) {
char greeting[] = "Hello";
printf("Length is %lu\n", strlen(greeting));
return 0;
}strlen: zliczanie znaków
strlen zwraca liczbę znaków przed znakiem końca napisu. Sam znak '\0' nie jest zliczany.
Dlatego strlen("cat") zwraca 3, mimo że tablica zajmuje 4 bajty.
#include <stdio.h>
#include <string.h>
int main(void) {
char word[] = "cat";
printf("strlen = %lu\n", strlen(word));
printf("sizeof = %lu\n", sizeof(word));
return 0;
}strlen ma złożoność O(n)
Ponieważ napisy w C nie przechowują swojej długości, strlen musi przejść przez każdy znak, aż znajdzie '\0'.
Dlatego jest operacją o złożoności O(n). W przypadku dużych napisów należy unikać wielokrotnego wywoływania jej w warunku pętli.
#include <stdio.h>
#include <string.h>
int main(void) {
char msg[] = "programming";
size_t len = strlen(msg);
for (size_t i = 0; i < len; i++) {
printf("%c", msg[i]);
}
printf("\n");
return 0;
}strcpy: kopiowanie napisów
Nie można kopiować napisów za pomocą =. Należy użyć strcpy(dest, src), które kopiuje src do dest, razem ze znakiem końca napisu.
Bufor docelowy musi być wystarczająco duży, aby pomieścić źródło wraz ze znakiem końca napisu.
#include <stdio.h>
#include <string.h>
int main(void) {
char src[] = "Hello";
char dest[20];
strcpy(dest, src);
printf("%s\n", dest);
return 0;
}Niebezpieczeństwo przepełnienia bufora w strcpy
Jeśli dest jest zbyt mały, strcpy zapisuje poza buforem, uszkadzając pamięć. Jest to klasyczny błąd bezpieczeństwa.
Należy preferować strncpy(dest, src, n), które kopiuje najwyżej n bajtów. Uwaga: strncpy może nie dodać znaku końca napisu, jeśli src jest zbyt długi.
#include <stdio.h>
#include <string.h>
int main(void) {
char src[] = "LongString";
char dest[5];
strncpy(dest, src, 4);
dest[4] = '\0';
printf("%s\n", dest);
return 0;
}strcat: łączenie napisów
strcat(dest, src) dołącza src na końcu dest. Zaczyna zapisywać w miejscu terminatora null w dest i dodaje nowy terminator na końcu.
dest musi już być poprawnym napisem z wystarczającą ilością wolnego miejsca.
#include <stdio.h>
#include <string.h>
int main(void) {
char buffer[20] = "Hello, ";
strcat(buffer, "World");
printf("%s\n", buffer);
return 0;
}Budowanie napisów krok po kroku
Można łączyć wywołania strcpy i strcat, aby budować napis fragment po fragmencie.
Zawsze należy zacząć od zainicjalizowanego bufora, aby pierwsze wywołanie strcat znalazło poprawny terminator.
#include <stdio.h>
#include <string.h>
int main(void) {
char full[50];
strcpy(full, "Mr. ");
strcat(full, "John ");
strcat(full, "Smith");
printf("%s\n", full);
return 0;
}Bezpieczniejsze łączenie za pomocą strncat
strncat(dest, src, n) dołącza najwyżej n znaków z src, a następnie zawsze dodaje terminator null.
Pomaga to zapobiegać przepełnieniom, gdy długość źródła jest nieznana.
#include <stdio.h>
#include <string.h>
int main(void) {
char dest[16] = "Data: ";
char src[] = "1234567890";
strncat(dest, src, 5);
printf("%s\n", dest);
return 0;
}Wartości zwracane
Zarówno strcpy, jak i strcat zwracają wskaźnik do dest. Umożliwia to zagnieżdżanie wywołań, choć może pogorszyć czytelność kodu.
strlen zwraca wartość typu size_t, który jest bez znaku. Należy zachować ostrożność podczas porównywania jej z liczbami całkowitymi ze znakiem.
#include <stdio.h>
#include <string.h>
int main(void) {
char a[20] = "foo";
char b[] = "bar";
printf("%s\n", strcat(a, b));
return 0;
}Częsta pułapka przy alokacji
Częstym błędem jest pominięcie +1 na terminator null podczas określania rozmiaru bufora.
Dla napisu o długości n potrzebnych jest n + 1 bajtów. Łączna długość dwóch połączonych napisów to strlen(a) + strlen(b) + 1.
#include <stdio.h>
#include <string.h>
int main(void) {
char a[] = "abc";
char b[] = "de";
size_t needed = strlen(a) + strlen(b) + 1;
printf("Need %lu bytes\n", needed);
return 0;
}Szybki test
Sprawdź swoją wiedzę na temat długości napisów.
Podsumowanie
Poznałeś(-aś) podstawowe funkcje z biblioteki string.h:
- strlen zlicza znaki przed
'\0'(O(n)). - strcpy kopiuje napis; miejsce docelowe musi być wystarczająco duże.
- strcat dołącza tekst do istniejącego napisu.
- Zawsze rezerwuj miejsce na terminator null i dla bezpieczeństwa preferuj warianty
strn*.
Często zadawane pytania
Czy lekcja „strlen, strcpy, strcat” jest bezpłatna?
Tak — pełny tekst „strlen, strcpy, strcat” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C Academy, przejdź na CoddyKit PRO. Kurs C Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „strlen, strcpy, strcat”?
Podstawowe funkcje obsługi napisów Ćwiczysz C Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C Academy?
Nie wymagamy żadnego doświadczenia. C Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „strlen, strcpy, strcat”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C Academy?
Tak. Każda lekcja C Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- strlen, strcpy, strcat
- strcmp i porównywanie
- strtok i tokenizacja
- memcpy i memset