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
ama mniejszą wartość niż wb - 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
- strlen, strcpy, strcat
- strcmp i porównywanie
- strtok i tokenizacja
- memcpy i memset