Verifica Univocità USERNAME

di il
19 risposte

Verifica Univocità USERNAME

Buonasera ragazzi,

ho implementato la seguente funzione per verificare l'univocità di un nickname inserito all'interno di una lista. Non capisco perché non mi fa reinserire il nickname (quando esiste già uno uguale). 

La seguente funzione:

1. NON FUNZIONA : appena inserisco il PRIMO generico utente anche con stesso username

2. FUNZIONA : al SECONDO utente che inserisco (quindi mi dice se ho un utente con stesso nome :  flag = TRUE)

 fgets(nuovo_Nodo -> nick, Char_size, stdin);
nuovo_Nodo -> nick[strlen(nuovo_Nodo -> nick) - 1] = 0;
            
if (strlen(nuovo_Nodo -> nick) == 0) {
            	puts("\t \t \t \n Nickname non valido.");

            } else {
            		// COPIO IN TEMP LA TESTA DELLA LISTA
        			temp_Utente = *testa;
        			
        			while(temp_Utente!= NULL && flag == false){
        				
        				if (strcmp(temp_Utente -> nick, nuovo_Nodo -> nick) == 0) {
                			flag = true;
                			break;
                		}
                		
                		temp_Utente = temp_Utente -> next_Utente;
	
					}
					
            		}	

Non capisco dove sia il problema. Alla PRIMA registrazione di un utente è come se non riuscisse a confrontare alla SECONDA si.

La cosa strana è la seguente, se inserisco come NICK = “EE” al primo avvio del programma, nonostante sia in lista (e se stampo la lista si vede), non mi dice di trovarlo, invece al secondo avvio me lo trova. E' come se la strcmp non funziona al primo avvio, non trova uguaglianza (anche se è presente, e lo so perchè si vede nella lista quando la stampo).

Questo pezzo di codice è presente all'interno di una funzione che ho chiamato registrazione.

19 Risposte

  • Re: Verifica Univocità USERNAME

    Se fai prima la ricerca e poi l'inserimento è corretto che la prima volta non trovi il dato.

    Solo da questa parte di codice però non si capisce.

    Comunque inserisci per prova una printf poco prima della strcmp per vedere a video i due dati che stai confrontando e capire cosa succede.

  • Re: Verifica Univocità USERNAME

    Questa è la PRIMA esecuzione del programmma, quindi PRIMA registrazione (considerando che ci sono 3 utenti già registrati con nickname in foto, ovvero aa,ss,rr) e si nota che non va nonostante STRCMP nonostante ci sia un nickname ss uguale a quello inserito.

    Di conseguenza mi registra un utente con un nickname già esistente. 

    Da quanto ho capito potrebbe essere un errore di lettura da file, in quanto:

    1. al PRIMO INSERIMENTO la lista viene creata da file;

    2. al SECONDO INSERIMENTO la lista si aggiorna automaticamente all0'interno di registrazione.

  • Re: Verifica Univocità USERNAME

    Arrestare il programma nel ciclo e controlla il contenuto della stringa. Ci sono sicuramente altri caratteri che non vedi oltre ad ss

    Devi imparare a fare debugging 

  • Re: Verifica Univocità USERNAME

    Dovrei aver individuato il problema. Dovrebbe essere nella lettura da file, o meglio, non riesce a controllare i NICK letti da file.

    Mi trova confronto valido solo con i nick inseriti direttamente in lista durante la fase di registrazione e non quelli già presenti ma letti da file.

    La lettura è la seguente. 

    Utente *letturaUtenti(FILE *fp) {
    
        int colonna = 0;
        char buf[BUFFER_SIZE];
    
        Utente *testaUtente = NULL;
        Utente *tempUtente = NULL; //temporanea
        Utente *precUtente = NULL;
    
        if (fp == NULL) {
            printColor("\t\t\t|-----------------------------|\n", COLOR_        |\n", COLOR_RED);
            printColor("\t\t\t|      File in creazione      |\n", COLOR_RED);
            printColor("\t\t\t|-----------------------------|\n", COLOR_RED);
        } else {
            while (!feof(fp)) {
                fgets(buf, BUFFER_SIZE, fp);
                tempUtente = (Utente *) malloc(sizeof(Utente));
                tempUtente->nextUtente = NULL;
    
                if (precUtente != NULL) {
                    precUtente->nextUtente = tempUtente;
                } else {
                    testaUtente = tempUtente;
                }
    
                char *tok;
                tok = strtok(buf, ",");
    
                while (tok) {
                    if (colonna == 0) {
                        tempUtente->id = atoi(tok);
                    }
                    if (colonna == 1) {
                        strcpy(tempUtente->nome, tok);
                        tempUtente->nome[strlen(tempUtente->nome)] = 0;
                    }
                    if (colonna == 2) {
                        strcpy(tempUtente->cognome, tok);
                        tempUtente->cognome[strlen(tempUtente->cognome)] = 0;
                    }
                    if (colonna == 3) {
                        strcpy(tempUtente->nick, tok);
                        tempUtente->nick[strlen(tempUtente->nick)] = 0;
                    }
                    if (colonna == 4) {
                        strcpy(tempUtente->email, tok);
                        tempUtente->email[strlen(tempUtente->email)] = 0;
                    }
                    if (colonna == 5) {
                        strcpy(tempUtente->dataNascita, tok);
                        tempUtente->dataNascita[strlen(tempUtente->dataNascita)] = 0;
                    }
                    if (colonna == 6) {
                        strcpy(tempUtente->password, tok);
                        tempUtente->password[strlen(tempUtente->password)] = 0;
                    }
                    if (colonna == 7) {
                        tempUtente->permessi = atoi(tok);
                    }
                    tok = strtok(NULL, ",");
                    colonna++;
                }
                colonna = 0;
                precUtente = tempUtente;
    
            }
        }
    
        return testaUtente;
    }
    
  • Re: Verifica Univocità USERNAME

    Ti ho detto di fermare il programma e controllare le stringhe durante la lettura.. non lo hai fatto 

  • Re: Verifica Univocità USERNAME

    Ti ho detto di fermare il programma e controllare le stringhe durante la lettura.. non lo hai fatto 

  • Re: Verifica Univocità USERNAME

    Appena torno a casa faccio il debug grazie.

    Ps. La cosa strana, non so se è una cavolata, è che comunque facendo strlen le due lunghezze sono uguali e pari a 3

  • Re: Verifica Univocità USERNAME

    Due lunghezze? Di quali stringhe parli?

    Sicuramente hai un terzo carattere nella stringa, probabilmente il \n introdotto dalla lettura con la fscanf. Non lo vedi e rende le stringhe diverse. Controlla bene in debug e risolvi in un attimo.

  • Re: Verifica Univocità USERNAME

    Intendevo la lunghezza delle due stringhe che confronto. Comunque si, appena controllo ti aggiorno, grazie ancora

  • Re: Verifica Univocità USERNAME

  • Re: Verifica Univocità USERNAME

    Mi sa che non hai scritto molto …  :-)

  • Re: Verifica Univocità USERNAME

    Si, scusami non aveva caricato le foto.

    La situazione è la seguente : 

  • Re: Verifica Univocità USERNAME

    Hai visto che in testa2->nick c'è uno spazio all'inizio della stringa?

    Che poi testa2 da dove viene? 

    Tu dovevi confrontare

    if (strcmp(temp_Utente -> nick, nuovo_Nodo -> nick) 

    quindi temp_Utente->nick e nuovo_Nodo->nick

    Se cambi la situazione non se ne esce

  • Re: Verifica Univocità USERNAME

    Non capisco da dove spunta quello spazio in più.

    Sisi, testa2 sarebbe il puntatore alla testa della lista (letta da file) che al momento è composta da un solo utente.

Devi accedere o registrarti per scrivere nel forum
19 risposte