0Pricing
C Academy · Lekcja

strcmp i porównywanie

Porównywanie napisów

strcmp i porównywanie to bezpłatna lekcja C Academy na CoddyKit. To lekcja 2 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.

Porównywanie napisów

W języku C nie można porównywać napisów za pomocą ==. Operator ten porównuje tylko adresy dwóch tablic, a nie ich zawartość.

Użyj strcmp(a, b) z biblioteki <string.h>, aby porównać znaki jeden po drugim.

#include <stdio.h>
#include <string.h>

int main(void) {
    char a[] = "apple";
    char b[] = "apple";
    if (strcmp(a, b) == 0)
        printf("Strings are equal\n");
    return 0;
}

Co zwraca strcmp

strcmp zwraca wartość typu int:

  • 0, jeśli napisy są równe
  • wartość ujemną, jeśli pierwszy różniący się znak w a ma mniejszą wartość niż w b
  • wartość dodatnią w przeciwnym razie
#include <stdio.h>
#include <string.h>

int main(void) {
    printf("%d\n", strcmp("abc", "abc"));
    printf("%d\n", strcmp("abc", "abd"));
    printf("%d\n", strcmp("abd", "abc"));
    return 0;
}

Pułapka „zero oznacza równość”

Częsty błąd polega na zapisaniu if (strcmp(a, b)) z oczekiwaniem, że oznacza to równość.

Pamiętaj, że strcmp zwraca 0 (wartość fałszywą), gdy napisy są równe, więc ten warunek jest prawdziwy, gdy napisy się różnią. Zawsze porównuj wynik jawnie z 0.

#include <stdio.h>
#include <string.h>

int main(void) {
    char input[] = "yes";
    if (strcmp(input, "yes") == 0)
        printf("Confirmed\n");
    else
        printf("Not confirmed\n");
    return 0;
}

Jak działa porównywanie

strcmp porównuje wartości ASCII (bajtowe) znaków po kolei, aż znajdzie różnicę albo dotrze do terminatora.

Wielkie litery (A=65) występują przed małymi (a=97), dlatego "Zebra" jest sortowane przed "apple".

#include <stdio.h>
#include <string.h>

int main(void) {
    printf("%d\n", strcmp("Zebra", "apple"));
    return 0;
}

Porządek leksykograficzny

Znak wyniku strcmp umożliwia sortowanie napisów alfabetycznie. Ujemny wynik oznacza, że pierwszy argument występuje wcześniej w porządku słownikowym.

#include <stdio.h>
#include <string.h>

int main(void) {
    const char *x = "banana";
    const char *y = "cherry";
    if (strcmp(x, y) < 0)
        printf("%s comes before %s\n", x, y);
    return 0;
}

strncmp: ograniczone porównywanie

strncmp(a, b, n) porównuje najwyżej n znaków. Jest to przydatne do sprawdzania prefiksów.

Można na przykład sprawdzić, czy napis zaczyna się od "http".

#include <stdio.h>
#include <string.h>

int main(void) {
    char url[] = "https://site.com";
    if (strncmp(url, "https", 5) == 0)
        printf("Secure URL\n");
    return 0;
}

Porównywanie bez uwzględniania wielkości liter

Standardowa funkcja strcmp rozróżnia wielkość liter. Aby ją zignorować, można podczas porównywania konwertować znaki za pomocą tolower z biblioteki <ctype.h>.

(Systemy POSIX oferują także strcasecmp, ale nie jest ona częścią standardu C).

#include <stdio.h>
#include <ctype.h>

int ci_cmp(const char *a, const char *b) {
    while (*a && (tolower(*a) == tolower(*b))) { a++; b++; }
    return tolower(*a) - tolower(*b);
}

int main(void) {
    printf("%d\n", ci_cmp("Hello", "hello"));
    return 0;
}

Wyszukiwanie za pomocą porównywania

Można przejść pętlą po tablicy napisów i użyć strcmp, aby znaleźć dopasowanie, podobnie jak w prostej tablicy wyszukiwania.

#include <stdio.h>
#include <string.h>

int main(void) {
    const char *fruits[] = {"apple", "banana", "cherry"};
    const char *target = "banana";
    for (int i = 0; i < 3; i++) {
        if (strcmp(fruits[i], target) == 0) {
            printf("Found at index %d\n", i);
        }
    }
    return 0;
}

Sortowanie napisów

Używając strcmp jako mechanizmu porównującego, można sortować tablice napisów. Oto krótka implementacja sortowania bąbelkowego, która zamienia wskaźniki miejscami zgodnie z kolejnością.

#include <stdio.h>
#include <string.h>

int main(void) {
    const char *names[] = {"Carol", "Alice", "Bob"};
    int n = 3;
    for (int i = 0; i < n - 1; i++)
        for (int j = 0; j < n - 1 - i; j++)
            if (strcmp(names[j], names[j+1]) > 0) {
                const char *t = names[j];
                names[j] = names[j+1];
                names[j+1] = t;
            }
    for (int i = 0; i < n; i++) printf("%s\n", names[i]);
    return 0;
}

Nie porównuj bezpośrednio przez odejmowanie

Możesz spróbować napisać własne porównywanie za pomocą a[i] - b[i], ale w przypadku surowych wartości typu char sposób interpretacji znaku zależy od implementacji, a ponadto może dojść do przepełnienia.

Preferuj biblioteczną funkcję strcmp, która prawidłowo obsługuje te przypadki brzegowe.

#include <stdio.h>
#include <string.h>

int main(void) {
    int r = strcmp("file1", "file2");
    printf("Result sign: %s\n", r < 0 ? "negative" : "non-negative");
    return 0;
}

Porównywanie danych wejściowych użytkownika

Praktycznym zastosowaniem jest sprawdzanie hasła lub wyboru z menu. Odczytaj dane wejściowe, a następnie porównaj je z oczekiwanymi wartościami za pomocą strcmp.

Aby sprawdzić równość, zawsze porównuj wynik z 0.

#include <stdio.h>
#include <string.h>

int main(void) {
    char choice[] = "quit";
    if (strcmp(choice, "quit") == 0)
        printf("Exiting program\n");
    return 0;
}

Szybki test

Sprawdź swoją wiedzę na temat wartości zwracanych przez strcmp.

Podsumowanie

Nauczyłeś(-aś) się porównywać napisy w języku C:

  • strcmp zwraca 0 dla równych napisów oraz wartość ujemną lub dodatnią określającą kolejność.
  • Nigdy nie używaj == do porównywania napisów; operator ten porównuje adresy.
  • Aby sprawdzić równość, zawsze testuj == 0 (pułapka polegająca na tym, że zero jest wartością fałszywą).
  • strncmp porównuje prefiks; porównywanie bez uwzględniania wielkości liter wymaga użycia tolower.

Często zadawane pytania

Czy lekcja „strcmp i porównywanie” jest bezpłatna?

Tak — pełny tekst „strcmp i porównywanie” 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 „strcmp i porównywanie”?

Porównywanie 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 2 z 4.

Ile czasu zajmuje lekcja „strcmp i porównywanie”?

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