Ce face strcmp și strncmp
Operatorul == între două șiruri compară adresele, nu textul. Pentru conținut folosești strcmp(a, b), care întoarce 0 dacă șirurile sunt identice, un număr negativ dacă a vine înaintea lui b și un număr pozitiv dacă vine după.
Comparația se face pe valorile octeților (ca unsigned char), deci literele mari vin înaintea celor mici („Zorro” < „ana”), iar literele cu diacritice (în UTF-8) vin după toate literele fără diacritice. Standardul garantează doar semnul rezultatului, nu valoarea: testează cu < 0, == 0, > 0.
strncmp(a, b, n) compară cel mult primele n caractere. Este util pentru prefixe: strncmp(linie, "ERROR", 5) == 0.
Parametri
| Parametru | Descriere |
|---|---|
a, b |
Cele două șiruri terminate cu '\0'. |
n |
La strncmp: câte caractere se compară cel mult. |
Ce returnează
0 pentru egalitate, valoare negativă dacă a < b, pozitivă dacă a > b.
Exemple
Exemplul 1: Verificarea unei parole de test
strcmp întoarce 0 la egalitate, de aceea condiția este == 0, nu doar strcmp(...).
#include <stdio.h>
#include <string.h>
int main(void) {
const char *introdus = "mere123";
if (strcmp(introdus, "mere123") == 0) {
printf("Acces permis\n");
} else {
printf("Parolă greșită\n");
}
return 0;
}
Rezultat
Acces permis
Exemplul 2: Ordinea dată de strcmp
Se afișează doar semnul rezultatului, pentru că valoarea exactă diferă de la o bibliotecă la alta.
#include <stdio.h>
#include <string.h>
static const char *semn(int r) {
return r < 0 ? "<" : r > 0 ? ">" : "==";
}
int main(void) {
printf("Ana %s Andrei\n", semn(strcmp("Ana", "Andrei")));
printf("Zorro %s ana\n", semn(strcmp("Zorro", "ana")));
printf("Ion %s Ion\n", semn(strcmp("Ion", "Ion")));
return 0;
}
Rezultat
Ana < Andrei
Zorro < ana
Ion == Ion
Exemplul 3: Prefix cu strncmp
#include <stdio.h>
#include <string.h>
int main(void) {
const char *coduri[] = {"RO-IS-01", "RO-CJ-07", "MD-CH-02", "RO-IS-14"};
for (size_t i = 0; i < 4; i++) {
if (strncmp(coduri[i], "RO-IS", 5) == 0) {
printf("%s este din Iași\n", coduri[i]);
}
}
return 0;
}
Rezultat
RO-IS-01 este din Iași
RO-IS-14 este din Iași
Greșeli frecvente
- Compari șiruri cu
==:if (s == "Ana")compară adrese și este aproape mereu fals (compilatorul poate și avertiza). - Scrii
if (strcmp(a, b))crezând că înseamnă „egale”. Este invers: condiția este adevărată când șirurile diferă. - Te bazezi pe
strcmpca să sortezi alfabetic cuvinte românești: „ăsta” ajunge după „zebră”. Pentru ordinea limbii ai nevoie destrcollcu o localizare setată sau de o bibliotecă dedicată.
Comenzi înrudite
strlen: Numără caracterele unui șir C până la terminatorul ‘\0’, fără să-l includă.strchr și strrchr: Caută un caracter într-un șir: strchr găsește prima apariție, strrchr pe ultima.strstr: Caută prima apariție a unui subșir într-un șir și întoarce un pointer la ea sau NULL.qsort: Sortează un tablou de orice tip, folosind o funcție de comparare scrisă de tine.Operatori de comparație și logici (== && || ! ?:): Compară valori și combină condiții: rezultatul este 1 (adevărat) sau 0 (fals); && și || se opresc cât mai devreme.