Aiuto comparazione stringhe con STRCMP

di il
11 risposte

Aiuto comparazione stringhe con STRCMP

Ciao,
non riesco a capire perchè nel primo caso ottengo che le due stringe sono uguali (quindi x=0), invece nel secondo caso no. A me sembra esattamente la stessa cosa. Aiutatemi! Grazie


char x;
char abc[]="abc";
char stringa[]="abc";
x=strcmp(abc,stringa);

-----------------------------------

char x;
char abc[]="abc";
x=strcmp(abc,"abc");

11 Risposte

  • Re: Aiuto comparazione stringhe con STRCMP

    Char abc[]="abc" in realtà è char abc[]="abc\0" , infatti viene inserito 'EOF a fine stringa, cosa che non avviene nelle stringhe testuali...

    prova pure strncmp(), con n=3 ; vedrai che nel 2° caso i primi 3 caratteri sono uguali, ma abc[] ha il terminatore in più, ecco perchè complessivamente non sono uguali

    2° stai attento che strcmp ritorna un int, non un char
  • Re: Aiuto comparazione stringhe con STRCMP

    Qui è opportuno scrivere una funzione per lo scopo,appoggiandosi a strncmp.
    
    bool AreStringsEquals(const char *s1,const char s2,size_t n)
    {
           assert(s1 !=  NULL && s2 != NULL &&  n != 0);
           int DoTheyMatch = strncmp(s1,s2,n);
           if( DoTheyMatch !=  0)
               return false;
           else
              return true;
    }
    
    Perdona lo stile misto,non mi venivano nomi migliori per s1 e s2. Qualcuno non digerisce lo stile camel case,ma sicuramente è più comprensibile della notazione ungara o notazioni simili.
  • Re: Aiuto comparazione stringhe con STRCMP

    Mikelius ha scritto:


    char abc[]="abc" in realtà è char abc[]="abc\0" , infatti viene inserito 'EOF a fine stringa, cosa che non avviene nelle stringhe testuali...
    Non diciamo eresie. In base a codesto bizzarro principio, non potrebbe funzionare neppure la più banale strcpy(array, "stringa")! Il terminatore '\0' è sempre considerato parte di ogni stringa letterale in fase di compilazione, senza distinzioni, e sarebbe assurdo il contrario. In fase di assegnazione iniziale, il terminatore viene copiato nell'array solo e unicamente perché già presente nella stringa letterale.
    L'OP commette sicuramente altri errori.

    Il seguente codice:
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main()
    {
        int x;
        char abc[] = "abc";
        char stringa[] = "abc";
    
        x = strcmp(abc, stringa);
        printf("x = %d\n", x);
        x = strcmp(abc, "abc");
        printf("x = %d\n", x);
        x = strcmp("abc", stringa);
        printf("x = %d\n", x);
    
        return EXIT_SUCCESS;
    }
    
    Deve compilare correttamente e fornire esattamente il risultato atteso.
    
    x = 0
    x = 0
    x = 0
    

    D'altro canto, l'assoluta equivalenza semantica col codice seguente riconferma la banale regola appena enunciata e sgombra il campo da ogni possibile dubbio. Qualsiasi occorrenza di una stringa letterale è null terminated, in qualunque versione dello standard C e con qualsiasi compilatore.
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define STRINGA "abc"
    
    int main()
    {
        int x;
        char abc[] = STRINGA;
        char stringa[] = STRINGA;
    
        x = strcmp(abc, stringa);
        printf("x = %d\n", x);
        x = strcmp(abc, STRINGA);
        printf("x = %d\n", x);
        x = strcmp(STRINGA, stringa);
        printf("x = %d\n", x);
    
        return EXIT_SUCCESS;
    }
    
  • Re: Aiuto comparazione stringhe con STRCMP

    loopunrolling ha scritto:


    Qui è opportuno scrivere una funzione per lo scopo,appoggiandosi a strncmp.
    
    bool AreStringsEquals(const char *s1,const char s2,size_t n)
    {
           assert(s1 !=  NULL && s2 != NULL &&  n != 0);
           int DoTheyMatch = strncmp(s1,s2,n);
           if( DoTheyMatch !=  0)
               return false;
           else
              return true;
    }
    
    Mi permetto di aggiungere, solo a beneficio della comprensione del nostro amico capelot81 e assolutamente non per screditare loopunrolling, che la funzione AreStringEquals() non serve a niente, non aggiunge niente ad una normalissima strncmp() e quindi consiglio di continuare ad utilizzare strcmp() come già faceva, naturalmente seguendo le indicazioni di M.A.W 1968.
  • Re: Aiuto comparazione stringhe con STRCMP

    Mikelius ... evitiamo certe argomentazioni ... aggiunge EOF ... ma sai cosa è EOF ? Che c'entra con il terminatore NUL di una stringa C?

    Prendiamo un bel respiro ed esaminiamo la richiesta ... è evidente che c'è un "altro" problema perché i due codici NON possono dare risultati diversi, quindi non avventuriamoci in scrittura di codice, utilizzo di altre funzioni e chissà cosa ...

    La cosa da chiedere è ... perché capelot81 ritiene che la seconda versione non funzioni? Cosa ottiene in x?
  • Re: Aiuto comparazione stringhe con STRCMP

    In realtà qualche differenza esiste tra AreStringEquals:
    - è più comprensibile e facile da usare.Ritorna true se le stringhe sono uguali e false in caso contrario,evitando ogni volta di dove scrivere il controllo (if strncmp () == 0 etc). È più facile da usare quando vogliamo sapere se s1 o non è uguale a s2. Il nome poi,pur non rientrando nello stile consigliato per il C,è più eloquente di strncmp.
    - assert aiuta a individuare immediatamente bug nel codice.Non appena si passa un NULL pointer o n = 0 (non ha senso confrontare 0 caratteri),il programma si arresta dicendo a quale riga l'asserzione è fallita. Beh non mi pare poco rilevare cosi in fretta i malfunzionamenti.

    Comunque a prescindere da codice extra etc,devi ottenere sempre 0 dal confronto di abc con "ABC" in ambedue i casi. Prova a scrivere il main,compilare e mostrare l'output insieme al codice completo.
  • Re: Aiuto comparazione stringhe con STRCMP

    loopunrolling ha scritto:


    - è più comprensibile e facile da usare

    qualsiasi programmatore C conosce strcmp() e strncmp() e, sempre per un programmatore C, non c'è niente di più eloquente di (strcmp(...) == 0).

    loopunrolling ha scritto:


    - assert aiuta a individuare immediatamente bug nel codice
    Anche su questo non sono d'accordo, le assert non risolvono il problema: personalmente, se scrivo delle funzioni di "utility" come questa, preferisco gestire anche i casi eccezionali, vuoi con dei codici di ritorno (per permettere di gestire l'errore ad alto livello) vuoi con delle logiche aggiuntive per cui, ad esempio nel tuo caso, se i due puntatori sono NULL restituisco 1, se uno dei due è NULL e l'altro no restituisco 0, se sono entrambi diversi da NULL restituisco strncmp(): almeno se qualcuno sopra ha sbagliato non esca fuori che è la mia funzione che ha generato l'errore
    Naturalmente queste sono solo opinioni mie
  • Re: Aiuto comparazione stringhe con STRCMP

    Chiedo venia per prima.


    capelot81 prova una comparazione strncmp(abc,"abc",3);
    al limite cambia compilatore, potrebbe essere un bug.
  • Re: Aiuto comparazione stringhe con STRCMP

    Infatti assert è stata inserita a scopo di debug,non come codice effettivo. In un codice definitivo io valore di ritorno indica se è stato possibile effettuare il confronto,e un quarto argomento contiene l'esito del confronto. Io preferisco tenere due versioni dello stesso programma: una per il debug e una come soluzione definitiva.
  • Re: Aiuto comparazione stringhe con STRCMP

    loopunrolling ha scritto:


    Infatti assert è stata inserita a scopo di debug,non come codice effettivo. In un codice definitivo io valore di ritorno indica se è stato possibile effettuare il confronto,e un quarto argomento contiene l'esito del confronto. Io preferisco tenere due versioni dello stesso programma: una per il debug e una come soluzione definitiva.
    Va benissimo, per carità. Il problema è che ci sono situazioni che vanno gestite opportunamente (o meglio, più semplicemente, vanno "gestite") e molti sviluppatori se ne lavano le mani inserendo delle assert(). Può darsi che situazioni particolari, come ad esempio un puntatore a NULL, capitino sulla versione "Release" (e per la legge di Murphy capiterà durante la dimostrazione del programma dal cliente ) e non siano mai capitate sulla versione "Debug": però c'è molta differenza (per il cliente almeno!) fra terminare il programma senza avvisi e invece segnalare un'anomalia e permettere, eventualmente, di ripetere l'operazione.
  • Re: Aiuto comparazione stringhe con STRCMP

    capelot81 ha scritto:


    Ciao,
    non riesco a capire perchè nel primo caso ottengo che le due stringe sono uguali (quindi x=0), invece nel secondo caso no. A me sembra esattamente la stessa cosa. Aiutatemi! Grazie


    char x;
    char abc[]="abc";
    char stringa[]="abc";
    x=strcmp(abc,stringa);

    -----------------------------------

    char x;
    char abc[]="abc";
    x=strcmp(abc,"abc");
    Il codice che hai postato è esattamente il copia-incolla di quello che hai compilato? non è che in una delle stringhe ci sono degli spazi all'inizio o alla fine?

    Inoltre, che valore ti ritorna esattamente la strcmp? (ricordati di metterlo in un int).
Devi accedere o registrarti per scrivere nel forum
11 risposte