Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    26

    [C] Problemi di confronto con la strncmp

    Buongi, devo realizzare una funzione che confronti delle parole inserite da input con le targhe italiane e vedere se la parola inserita dall'utente sia componbile con queste sigle caricate in un vettore precedentemente.
    Non riesco a capire dove sia il problema, credo sia più un errore di sintassi visto che il programma quando viene inserita una parola con numero di lettere pari (caso del compare) crasha.

    Vettsigle e' la matrice 200x3 dove sono inserite tutte le targhe italiane

    codice:
    while(n_parole<100 && (scanf("%s",parola))!=EOF)
    {
    int indparola=0;
    int i;
    
        if((strlen(parola))%2!=0)
        {
            printf("La parola numero %d non e' componibile \n", n_parole+1 );
            n_parole++; //Contatore di parole inserite
        }
        else
        {
            for(i=0;i<numsigle;i++)
            {
                if( strncmp(parola[indparola],vettsigle[i],2)==0 )
                {
                    indparola+=2;
                    i=0;
                    if( indparola==strlen(parola) )
                    {
                        printf("La parola numero %d e' accettata! \n",n_parole+1 );
                        n_parole++;
                        break; // A parola trovata, il ciclo si rompe
                    }
                }
            }
            if( i == numsigle )
            {
                printf("La parola numero %d non e' componibile",n_parole+1);
                n_parole++;
            }
        }
    }
    Grazie anticipato a chi mi darà una mano

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    strncmp confronta stringhe null terminated, mentre tu gli passi dei caratteri.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    26
    Come posso ovviare?

    Qui c'è un esempio di quello che teoricamente vorrei fare http://www.cplusplus.com/reference/c...tring/strncmp/

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    In quell'esempio str è un vettore di stringhe, mentre tu hai solo stringhe (come appare da quel strlen(parola)); vettsigle non ho idea di cosa sia visto che appare solo nell'if, ma presumo sia un vettore di stringhe contententi le sigle, giusto?

    Invece di usare parola[indparola] devi usare solo parola
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    26
    Si, vettsigle è la matrice contenente tutte le targhe italiane.
    Se io mettessi solo parola senza l'indice, andrei a confrontare solo le prime 2 lettere di parola tralasciando le altre.
    Ti spiego con un esempio.
    Inserisco FINALE.
    FINALE va splittato in : FI NA LE
    Ora il mio programma deve andare a cercare FI nella matrice e vedere se c'è.
    Se mi da vero, continua e passa a NA e fa la stessa cosa.
    Se arrivo alla fine e trovo uno riscontro con le coppi di lettere mi tengo la parola altrimenti la etichetto come non componibile.

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    D'accordo, ma la cosa importante che devi tenere presente è che parola[indparola] restituisce un carattere, mentre la strncmp si aspetta un const char* (quindi una stringa null terminated), pertanto quell'if è sbagliato e da errore.
    Il tuo problema lo risolvi semplicemente aggiungendo un & davanti a parola[indparola] che in pratica darà vita a una sottostringa di lunghezza strlen(parola) - indparola che sarà controntata poi la matrice.

    Questo insomma:
    codice:
    if( strncmp(&parola[indparola],vettsigle[i],2)==0 )
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    26
    Ok grazie
    ora funziona, il motivo di mettere la &? Che significato "tecnico" ha?

  8. #8
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da ZioDema2
    ora funziona, il motivo di mettere la &? Che significato "tecnico" ha?
    "indirizzo di"
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.