Ce face std::strcmp
Două șiruri C nu se pot compara cu ==: operatorul compară adresele, nu textul. strcmp(a, b) compară conținutul octet cu octet și returnează 0 dacă textele sunt identice, un număr negativ dacă a vine înainte și unul pozitiv dacă vine după.
strncmp(a, b, n) compară doar primele n caractere, util pentru verificarea unui prefix. Ca la std::string::compare, contează doar semnul rezultatului.
Parametri
| Parametru | Descriere |
|---|---|
a, b |
Șirurile comparate. |
n |
Pentru strncmp: numărul maxim de caractere comparate. |
Ce returnează
Un int: negativ, 0 sau pozitiv.
Exemple
Exemplul 1: Egalitate și ordine
#include <cstdio>
#include <cstring>
int main() {
const char* parola = "secret";
char introdus[] = "secret";
std::printf("== compară adrese: %s\n", (parola == introdus) ? "egale" : "diferite");
std::printf("strcmp compară textul: %s\n", std::strcmp(parola, introdus) == 0 ? "egale" : "diferite");
int r = std::strcmp("Ana", "Bogdan");
std::printf("Ana vs Bogdan: %s\n", r < 0 ? "Ana e înainte" : "Ana e după");
}
Rezultat
== compară adrese: diferite
strcmp compară textul: egale
Ana vs Bogdan: Ana e înainte
Exemplul 2: Verificarea unui prefix cu strncmp
#include <cstdio>
#include <cstring>
int main() {
const char* comenzi[] = {"GET /index", "POST /login", "GET /contact"};
for (const char* c : comenzi) {
if (std::strncmp(c, "GET", 3) == 0) {
std::printf("citire: %s\n", c + 4);
}
}
}
Rezultat
citire: /index
citire: /contact
Greșeli frecvente
- Compari șiruri C cu
==: verifici dacă sunt aceeași adresă de memorie, nu același text. - Scrii
if (strcmp(a, b))crezând că înseamnă „egale”: condiția e adevărată tocmai când diferă.
Comenzi înrudite
std::string::compare: Compară două șiruri și returnează un număr negativ, zero sau pozitiv, ca la sortare.std::memcmp: Compară n octeți din două zone de memorie: 0 dacă sunt identici.std::strchr: Caută un caracter (strchr) sau un text (strstr) într-un șir C și returnează pointer la el.