0Pricing
C Academy · Lekcja

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

  1. strlen, strcpy, strcat
  2. strcmp i porównywanie
  3. strtok i tokenizacja
  4. memcpy i memset
← Powrót do C Academy