strcmp și strncmp în C

Compară două șiruri caracter cu caracter și spune dacă sunt egale sau care vine primul.

Sintaxă
#include <string.h>
int strcmp(const char *a, const char *b);
int strncmp(const char *a, const char *b, size_t n);

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 strcmp ca să sortezi alfabetic cuvinte românești: „ăsta” ajunge după „zebră”. Pentru ordinea limbii ai nevoie de strcoll cu 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.