0Pricing
C Academy · Lezione

strcmp e confronto

Confrontare stringhe

strcmp e confronto è una lezione C Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C Academy include 4 lezioni in totale.

Confrontare le stringhe

In C non è possibile confrontare le stringhe con ==. Questo confronta soltanto gli indirizzi di due array, non il loro contenuto.

Usate strcmp(a, b) di <string.h> per confrontarle carattere per carattere.

#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;
}

Cosa restituisce strcmp

strcmp restituisce un int:

  • 0 se le stringhe sono uguali
  • un valore negativo se il primo carattere diverso in a è minore di quello in b
  • un valore positivo in caso contrario
#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;
}

L'errore dell'uguaglianza rappresentata da zero

Un errore comune consiste nello scrivere if (strcmp(a, b)) aspettandosi che significhi «uguale».

Ricordate che strcmp restituisce 0 (falso) quando le stringhe sono uguali, quindi la condizione è vera quando differiscono. Confrontate sempre esplicitamente il risultato con 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;
}

Come funziona il confronto

strcmp confronta i valori ASCII (dei byte) dei caratteri uno alla volta, fino a quando trova una differenza o raggiunge un terminatore.

Le lettere maiuscole (A=65) vengono prima delle minuscole (a=97), quindi "Zebra" viene prima di "apple" nell'ordinamento.

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

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

Ordinamento lessicografico

Il segno del risultato di strcmp consente di ordinare le stringhe alfabeticamente. Un risultato negativo significa che il primo argomento viene prima nell'ordine alfabetico.

#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: confronto limitato

strncmp(a, b, n) confronta al massimo n caratteri. È utile per verificare i prefissi.

Ad esempio, per verificare se una stringa inizia con "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;
}

Confronto senza distinzione tra maiuscole e minuscole

Il normale strcmp distingue tra maiuscole e minuscole. Per ignorare questa differenza, durante il confronto è possibile convertire i caratteri con tolower di <ctype.h>.

(I sistemi POSIX offrono anche strcasecmp, ma non fa parte dello standard 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;
}

Cercare con il confronto

È possibile scorrere un array di stringhe e usare strcmp per trovare una corrispondenza, come in una semplice tabella di ricerca.

#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;
}

Ordinare le stringhe

Usando strcmp come motore del confronto, è possibile ordinare gli array di stringhe. Ecco un piccolo bubble sort che scambia i puntatori in base all'ordine.

#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;
}

Non confrontate direttamente con una sottrazione

Potreste provare a scrivere un confronto personalizzato con a[i] - b[i], ma con valori char grezzi il comportamento del segno dipende dall'implementazione e può verificarsi un overflow.

Preferite la libreria strcmp, che gestisce correttamente questi casi limite.

#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;
}

Confrontare l'input dell'utente

Un utilizzo concreto consiste nel verificare una password o una scelta di menu. Leggete l'input, quindi confrontatelo con i valori attesi usando strcmp.

Confrontate sempre il risultato con 0 per verificare l'uguaglianza.

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

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

Verifica rapida

Verificate la vostra comprensione dei valori restituiti da strcmp.

Riepilogo

Avete imparato a confrontare le stringhe in C:

  • strcmp restituisce 0 per le stringhe uguali, un valore negativo o positivo per indicarne l'ordine.
  • Non usate mai == sulle stringhe: confronta gli indirizzi.
  • Verificate sempre == 0 per controllare l'uguaglianza (l'errore dello zero interpretato come falso).
  • strncmp confronta un prefisso; il confronto senza distinzione tra maiuscole e minuscole richiede tolower.

Domande Frequenti

La lezione «strcmp e confronto» è gratuita?

Sì — il testo completo di «strcmp e confronto» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C Academy, passa a CoddyKit PRO. Il corso C Academy include 4 lezioni in totale.

Cosa imparerò in «strcmp e confronto»?

Confrontare stringhe Eserciti C Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C Academy?

Non è richiesta alcuna esperienza precedente. C Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «strcmp e confronto»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C Academy?

Sì. Ogni lezione C Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. strlen, strcpy, strcat
  2. strcmp e confronto
  3. strtok e tokenizzazione
  4. memcpy e memset
← Torna a C Academy