Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    82

    [C] Problema esecuzione programma

    Ciao a tutti, oggi volevo creare un programma che permetteva di registrarsi e poi eseguire il login con interfaccia UI, la compilazione non rileva nessun errore, ma l'esecuzione del programma non era proprio come me l'aspettavo, quando metto il nome utente e poi premo invio, mi passa subito al login e quando metto il nome utente per il login premo invio e termina il programma, sia nella registrazione che nel login non mi chiede nè password nè altro, questo è il codice:
    codice:
    #include <stdio.h>
    
    int main(int argc, char **argv)
    {
    	int a = 1;
    	char nome, password, nome1, password1;
    	
    	printf ("REGISTRAZIONE\n");
    	printf ("-------------");
    	printf ("\n");
    	
            printf ("Inserisci un nome utente: ");
    	scanf ("%c", &nome);
    	getchar();
    	
    	printf ("Inserisci una password: ");
    	scanf ("%c", &password);
    	getchar();
    	
    	printf("\n   Registrazione completata. Ecco i tuoi dati di accesso:\n");
    	
            printf("NOME UTENTE: %c", nome);
    	printf("PASSWORD: %c", password);
    	printf("\n");
    	printf("Premi ENTER per eseguire il Login...");
    	getchar();
    	
    	while (a < 50){
    		printf("\n");
    		a++;
    	}
    	
    	printf("LOGIN\n");
    	printf("-----");
    	printf("\n");
    	
    	printf("Inserisci il nome utente: ");
    	scanf("%c", &nome1);
    	getchar();
    	
    	printf("Inserisci la password: ");
    	scanf("%c", &password1);
    	getchar();
    	
    	
    	if (nome1 == nome && password1 == password){
    		printf("\n\nACCESSO CONSENTITO");
    	}
    	else{
    		printf("ACCESSO NEGATO");
    	}
    
    	return 0;
    }
    Cosa c'è che manca?

    Grazie anticipato a tutti.

  2. #2
    Le stringhe non sono dei singoli char, ma degli array di char... rileggiti il capitolo sulle stringhe del tuo libro di C.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    82
    Originariamente inviato da MItaly
    Le stringhe non sono dei singoli char, ma degli array di char... rileggiti il capitolo sulle stringhe del tuo libro di C.
    Che intendi per "singoli char, ma degli array di char"

    EDIT: Ho capito adesso , e come faccio a fargli inserire più di una lettera?

  4. #4
    Perché ogni volta che fai scanf("%c", ...) leggi un solo carattere, e il resto dell'input inserito resta nel buffer, e viene quindi prelevato dalle successive getchar() e scanf, che vengono "soddisfatte" già dalla prima stringa data in input.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it L'avatar di Salvy95
    Registrato dal
    Jul 2008
    Messaggi
    199
    influisce perché provi ad allocare più memoria di quanta ne hai inizializzata... è come se provassi ad inserire all'interno di un hard disk di 500MB, 300GB... il sistema automaticamente passa all'hard disk successivo, ma non essendoci perché il tuo è un char (un singolo hard disk) scrive i tuoi caratteri nel primo hard disk libero che riesce a trovare e tocca indirizzi che non dovrebbero essere toccati! spero sia stato chiaro!

    Mitaly mi ha anticipato

    per accumulare più memoria, inizializza i char come

    codice:
    char nome_var[dimensione_var];
    dopodiché
    codice:
    scanf("%s", &nome_var[0]);

  6. #6
    Utente di HTML.it L'avatar di Freax
    Registrato dal
    Jul 2006
    Messaggi
    460
    l'operatore di conversione da usare con le stringhe è %s, comunque come fatto notare più volte dagl utenti del forum come MItaly, scanf non è una funzione che ti mette al riparo da problemi derivanti da un input "malizioso", quindi usa getchar che è più sicura.

    ricorda anche che lo spazio è solitamente un carattere di separazione, leggiti sempre il manuale e la descrizione della funzione che deciderai di usare.

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    82
    Originariamente inviato da MItaly
    Perché ogni volta che fai scanf("%c", ...) leggi un solo carattere, e il resto dell'input inserito resta nel buffer, e viene quindi prelevato dalle successive getchar() e scanf, che vengono "soddisfatte" già dalla prima stringa data in input.
    Grazie, adesso è tutto più chiaro, ma allora come faccio a fargli inserire più di una lettera?

  8. #8
    Originariamente inviato da Salvy95
    influisce perché provi ad allocare più memoria di quanta ne hai inizializzata... è come se provassi ad inserire all'interno di un hard disk di 500MB, 300GB... il sistema automaticamente passa all'hard disk successivo, ma non essendoci perché il tuo è un char (un singolo hard disk) scrive i tuoi caratteri nel primo hard disk libero che riesce a trovare e tocca indirizzi che non dovrebbero essere toccati! spero sia stato chiaro!
    No... quello che stai descrivendo credo che sia un buffer overflow, ma qui non si verifica nulla di tutto ciò: non sta usando una stringa di formato "%s" con dei singoli char, per i quali invece usa correttamente la "%c". Il punto è che, invece di acquisire una stringa per ogni scanf, di fatto acquisisce un singolo carattere ogni scanf, e i caratteri del primo input (dato che l'input è bufferizzato in C) bastano per tutte le scanf.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    82
    Originariamente inviato da Salvy95
    influisce perché provi ad allocare più memoria di quanta ne hai inizializzata... è come se provassi ad inserire all'interno di un hard disk di 500MB, 300GB... il sistema automaticamente passa all'hard disk successivo, ma non essendoci perché il tuo è un char (un singolo hard disk) scrive i tuoi caratteri nel primo hard disk libero che riesce a trovare e tocca indirizzi che non dovrebbero essere toccati! spero sia stato chiaro!

    Mitaly mi ha anticipato

    per accumulare più memoria, inizializza i char come

    codice:
    char nome_var[dimensione_var];
    dopodiché
    codice:
    scanf("%s", &nome_var[0]);
    In dimensione_var cosa ci dovrei mettere?

  10. #10
    Originariamente inviato da jackazz
    Grazie, adesso è tutto più chiaro, ma allora come faccio a fargli inserire più di una lettera?
    Devi usare delle stringhe, ovvero degli array di char, con la relativa stringa di formato per la scanf ("%s", occhio che così com'è è potenzialmente insicura e si ferma agli spazi, fai meglio ad usare la fgets).
    Originariamente inviato da jackazz
    In dimensione_var cosa ci dovrei mettere?
    La dimensione massima della stringa che vuoi accettare. Di nuovo, non usare scanf con "%s", ma fgets.
    E, se non sai ancora come si usano le stringhe, leggiti il relativo capitolo del tuo libro di C, imparare le stringhe a "tips & tricks" su un forum è deleterio.
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.