Il programma si arresta senza dare errore

di il
19 risposte

Il programma si arresta senza dare errore

Salve, ho un problema non il programma che sto implementando adesso. Sono molte righe quindi riporterò sul forum solo la funzione che mi sta dando problemi. La funzione in sintesi procede normalmente ma arrivato ad un certo punto si ferma senza restituire alcun errore. Termina dove è presente il "printf("\n3");". Quindi esce correttamente dal for e poi si ferma, l'unica cosa che gli rimarrebbe da fare sarebbe il return ma non lo fa (so che non lo fa perché il printf() prima del return non viene stampato

Credo si tratti di un errore di segmentation fault ma non ne sono sicuro
int check(char username[], char password[]){
	int i=0,j=0, k=0;
	FILE *fp;
	char lettura[10][10];
	int u=0, p=0; //controllo utente e password
	int dim;
	printf("\n Lo username: %s", username);
	printf("\n La password: %s", password);
	
	fp=fopen("utenti.txt","r"); //apro il file in lettura

	if(fp){ 

		while(!feof(fp)){
			
			fscanf(fp, "%s", lettura[i]);
			i++;
				
		}//fine while della lettura file
		
	}else{
		printf("Errore apertura file!");
	}//fine controllo esistenza file
	
	fclose(fp);


	dim=i-1;	
	printf("\n");
	for(i=0; i<dim; i++){  //stampo la matrice
		for(j=0; lettura[i][j] != '\0'; j++){
			printf("%c", lettura[i][j]);
		}

		printf("\n");
	}


	j=0;
     for(i=0; i<dim; i++){  //controllo che sia presente nel file il nome utente. Se si allora u=1;
        if(username[k] == lettura[i][j]){
            while(lettura[i][j] == username[k]){

                    printf("\nuser[k] = %c mentre lettura[i][j] = %c\n", username[k], lettura[i][j]);
                    j++;
                    k++;

			printf("\nk=%d ed user=%d", k, strlen(username));
                if(k==(strlen(username))){
		    printf("\nu=1");
                    u=1;
		    k=0;
                   
                }
            }

printf("\n1");
               
        }

printf("\n2");

    }
printf("\n3");
	
	printf("\nritorno 0");

	  return 0;

	
}
COmunque la funzione dovrebbe riceve i parametri username e password, aprire un file, leggerli dal file e verificare se i parametri sono presenti nel file

19 Risposte

  • Re: Il programma si arresta senza dare errore

    Up
  • Re: Il programma si arresta senza dare errore

    Inutile fare un a due ore dall'apertura del thread di domenica. Magari la gente sta fuori e comunque il forum on è un servizio in tempo reale a pagamento.
  • Re: Il programma si arresta senza dare errore

    Imparate a usare il debugger se avete fretta.
  • Re: Il programma si arresta senza dare errore

    In ogni caso, mi sembra che non hai chiaro che in quell'array ci sono stringhe e quindi possono e devono essere trattate con le opportune funzioni di libreria (non come sequenze di caratteri).

    Quindi elimina tutto dopo la fclose e scrivi solo
    
    	int res = 0;
    	dim = i;
    	for (i = 0; i < dim; i += 2)
    		if (strcmp(username, lettura[i]) == 0 && strcmp(password, lettura[i + 1]) == 0)
    			res = 1;
    
    	return res;
    
  • Re: Il programma si arresta senza dare errore

    Scusa ma perché non posso trattare l array come sequenza di caratteri? L array è una sequenza di caratteri no? Sto al terzo anno di uni e nell intenso studio del primo mi era sembrato capire che le stringhe andassero trattate così.
    Comunque qual era il problema? La troppa manipolazione dei caratteri creava un segmentation fault?

    In ogni caso adesso sono a lavoro, domani lo provo e vi faccio sapere. Grazie tante!
  • Re: Il programma si arresta senza dare errore

    giulio0 ha scritto:


    Scusa ma perché non posso trattare l array come sequenza di caratteri? L array è una sequenza di caratteri no?
    Non che non puoi ma non ha senso. Allora perché usi la fscanf e non leggi carattere per carattere da file? Un discorso incoerente ...
    Sto al terzo anno di uni e nell intenso studio del primo mi era sembrato capire che le stringhe andassero trattate così.
    All'inizio è possibile ma poi si studiano le funzioni standard per la gestione stringhe (ad esempio la fscanf) e al terzo anno di università dovreste saperle usare.
    Comunque qual era il problema? La troppa manipolazione dei caratteri creava un segmentation fault?
    Era un codice tanto contorto che non ho neanche controllato. Del resto quel codice non controlla la password (ho assunto che nel file l'utente sia in una riga e la password nella successiva) ma solo l'username. E poi non ho replicato il problema con nessun valore di prova. Tu con quali dati in ingresso hai il problema?
  • Re: Il programma si arresta senza dare errore

    Allora ti spiego tutto dall inizio.
    1. Il client fornisce username e password al main tramite la write
    2. Lo username è pass vengono passati per parametro alla funzione

    Non ho utilizzato fgets perché stranamente quando lo usavo il programma al passaggio dello username si bloccava. Quindi ho sostituito con fscaf e tutto andava liscio.

    Inoltre anche io avevo usato lo strcmp() ma poiché con lo fscanf prendevo anche valori casuali oltre allo user e pass allora non li vedeva uguali. Comunque poi proverò il tuo domani mattina
  • Re: Il programma si arresta senza dare errore

    Non hai detto come sono i dati sul file.

    Non hai detto con quali dati hai provato per avere il problema.

    Poi ricorda che usi stringhe con max 9 caratteri... ne dovresti prevedere di più. E dovresti essere sicuro che in ingresso le stringhe siano terminate da zero.

    Usa la strcmp e risolvi i problemi che incontri non cambiare con altre funzioni senza comprendere.
  • Re: Il programma si arresta senza dare errore

    Che intendi come sono i dati? Sono stringhe (sono scritte su un semplice file di testo).

    I file vengono passati dal client tramite stringhe. Ho risposto alle domande?
  • Re: Il programma si arresta senza dare errore

    No. Non mi hai detto con quale utente e password hai provato e si blocca.

    E non hai detto se su file sono scritti così

    pippo
    pwd1

    oppure

    pippo pwd1

    E non hai detto se dal client sei sicuro che le stringhe arrivino terminate correttamente da 0 o buffer non terminati.

    In ogni vaso così come usi printf e fscanf usa anche la strcmp per le stringhe.
  • Re: Il programma si arresta senza dare errore

    Ho provato ad utilizzare la tua parte di codice e stranamente il programma non entra nemmeno nella funzione.

    Io passo questi parametri (stessi parametri che sono presenti nel foglio utenti.txt) :
    username: valerio
    password: panzera

    i parametri sono chiesti dal programma tramite 2 scanf, e per passarli utilizzo due write(), mentre il server li riceve tramite due read() nei rispettivi array username() e password(). Infine li "dovrebbe" passare alla funzione questi due array

    queste sono le due read() che lo ricevono e la funzione check() vista prima
    read(clientConnectionDescriptor,username,sizeof(username));
    	    read(clientConnectionDescriptor,password,sizeof(password));
    	    esiste=check(username, password);
    mentre queste sono le due write() (dentro una while finché non si verifica l'account)
    while(account==0){
    		char dati[10];
    		char username[10];
    		char password[10];
    		
    		printf("\nInserire username: \n");
    		scanf("%s", username);
    		write(socketClientDescriptor, username, sizeof(username));
    		
    		printf("\nInserire password: \n");
    		scanf("%s", password);
    		write(socketClientDescriptor, password, sizeof(password));
    			
    	}//fine while per sistema di registrazione/accesso
    Ho provato a vedere se terminasse con '\0' tramite un printf dentro un for, non stampa nulla nonostante questo for sia proprio all'inizio del programma. Che sta succedendo? :,(
    Allegati:
    26166_5dab5fbae1aa28aa6608ec43882e3359.png
    26166_5dab5fbae1aa28aa6608ec43882e3359.png
  • Re: Il programma si arresta senza dare errore

    Una cosa è la funzione per cui hai aperto questo thread altra storia la trasmissione/ricezione via socket su cui poco si può dire.

    Per capire se la ricezione funziona inserisci le print di username e password subito prima di

    esiste=check(username, password);

    e controlla cosa visualizzi
  • Re: Il programma si arresta senza dare errore

    Questo controllo lo avevo fatto dentro la funzione e visualizzavo le cose correttamente.
    comunque l'ho rifatto come dici tu ed è lo stesso, le stringhe passano correttamente, però c'è una cosa che mi lascia perplesso.
    1.inserisco valerio premo invio e non appare nulla al server;
    2. inserisco panzera e premo invio ed appare il nome valerio;
    3. inserisco nuovamente una stringa ed appare panzera + la stringa inserita;
    Allegati:
    3. inserisco nuovamente una stringa ed appare panzera + la stringa inserita;
    3. inserisco nuovamente una stringa ed appare panzera + la stringa inserita;

    2. inserisco panzera e premo invio ed appare il nome valerio;
    2. inserisco panzera e premo invio ed appare il nome valerio;

    1.inserisco valerio premo invio e non appare nulla al server;
    1.inserisco valerio premo invio e non appare nulla al server;
  • Re: Il programma si arresta senza dare errore

    Ecco ... allora il problema è nella trasmissione/ricezione.
Devi accedere o registrarti per scrivere nel forum
19 risposte