Oppure

Loading
19/10/20 16:04
prdsgl
Scrivere un programma che richieda in input le credenziali di accesso ad un sistema informatico. Esse sono formate da indirizzo e-mail e password, da conservare nelle stringhe chiamate rispettivamente email e password.
Affinché l'indirizzo e-mail sia valido occorre che all'interno della stringa sia presente il carattere @ (tale carattere non deve figurare né come primo né come ultimo). L'inserimento della e-mail è in chiaro.
Affinché la password sia valida occorre che la sua lunghezza sia compresa tra 8 e 15.
L'inserimento della password è oscurata tramite caratteri *.
Se una delle due credenziali non è valida, il sistema deve chiedere all'utente se vuole reinserirla o uscire dal programma; la risposta dell'utente deve essere 'S' oppure 'N'. Se le credenziali sono valide, il programma deve far visualizzare a video il messaggio "Accesso consentito".



vi prego aiutatemi sono in crisi
19/10/20 20:14
AldoBaldo
Per l'e-mail te la cavi con un fgets() e qualche verifica.

Per la password potrebbe essere la stessa cosa, ma la necessità di "oscurare" la visualizzazione dell'input direi che esclude il C standard, perché occorre "intercettare" l'azionamento dei tasti PRIMA che venga visualizzata in console la lettera corrispondente. Magari ti torna utile conio.h , ma potrebbero esserci altri metodi più efficaci che ora proprio non mi vengono in mente.
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
19/10/20 22:55
Carlo
Scusa se mi intrometto, ma se digiti un carattere che deve essere oscurato con *** sostituendolo al volo, non credo che lo schermo sia in grado di mostrarlo...
Non so se mi sono spiegato, viene digitato un carattere, lo intercetto e lo memorizzo in una variabile, e immediatamente lo sovrascrivo con *, nello schermo il carattere reale non verrà mostrato perchè il codice va migliaia di volte più veloce del rinfresco dello schermo.

Mi riscuso, perché forse in C c'è qualche cosa che non so e non si può fare, ma mi sembra strano.

EDIT: ho riletto meglio, ti riferivi ad un'applicazione console.... :blush:
Ultima modifica effettuata da Carlo 19/10/20 23:18
in programmazione tutto è permesso
20/10/20 8:38
nessuno
Carlo, in C alcune funzioni di input sono bufferizzate e non ti consentono di "intercettare" il carattere prima che venga visualizzato.

Bisogna utilizzare la kbhit() insieme alla getch() con un ciclo. La prima non è standard.

@prdsgl ... hai postato il testo del problema ma nessun tentativo di risolverlo, usando un titolo di thread che non ha senso.

Cosa ti aspetti?
Ultima modifica effettuata da nessuno 20/10/20 8:40
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
20/10/20 13:08
Thejuster

Infatti, credo che la cosa migliore come dice nessuno, sai un ciclo dove venga preso in considerazione il getch e spostato tutto char per char in un array.
Al momento del tasto return visualizzare gli * in base alla grandezza dell'array.

mire.forumfree.it/ - Mire Engine
C# UI Designer
20/10/20 14:47
Carlo
Postato originariamente da Thejuster:


Infatti, credo che la cosa migliore come dice nessuno, sai un ciclo dove venga preso in considerazione il getch e spostato tutto char per char in un array.
Al momento del tasto return visualizzare gli * in base alla grandezza dell'array.


Infatti quando in HyperTerminal o similia si immettono le password, non si vede nulla.
in programmazione tutto è permesso
21/10/20 12:37
AldoBaldo
Al momento in cui ho scritto la mia prima risposta in effetti avevo già risolto il "caso" in un programma funzionante, però o dovuto usare getch(), che non mi pare sia nello standard ma sia una specie di "estensione" valida solo in alcuni contesti particolari (non mi si chieda quali!). Non ho avuto bisogno di ricorrere a kbhit(). Il file di intestazione che ho dovuto includere è conio.h

Una soluzione potrebbe seguire un ragionamento di questo tipo:

ho un lMin che mi da' la lunghezza minima della password
ho un lMax che mi da' la lunghezza massima della password
ho un array di char s con una capacita' di almeno lMax+1 elementi
predispongo una variabile l per la lunghezza della password (inizialmente 0)

fintanto che l<lMin {
    fintanto che getch() non rileva un "a capo" {
        se l<=lMax {
            mostra '*'
        }
        altrimenti {
            segnala l'errore
            azzera nuovamente l
            chiede di ripetere l'immissione della password
        }
        
        se l<lMin {
            segnala l'errore
            azzera nuovamente l
            chiede di ripetere l'immissione della password
        }
    }
}

(a questo punto la password di lunghezza l compresa tra lMin e
 lMax e' in s, ma va aggiunto in coda il classico terminatore 'Al momento in cui ho scritto la mia prima risposta in effetti avevo già risolto il "caso" in un programma funzionante, però o dovuto usare getch(), che non mi pare sia nello standard ma sia una specie di "estensione" valida solo in alcuni contesti particolari (non mi si chieda quali!). Non ho avuto bisogno di ricorrere a kbhit(). Il file di intestazione che ho dovuto includere è conio.h


Una soluzione potrebbe seguire un ragionamento di questo tipo:

ho un lMin che mi da' la lunghezza minima della password
ho un lMax che mi da' la lunghezza massima della password
ho un array di char s con una capacita' di almeno lMax+1 elementi
predispongo una variabile l per la lunghezza della password (inizialmente 0)

fintanto che l<lMin {
    fintanto che getch() non rileva un "a capo" {
        se l<=lMax {
            mostra '*'
        }
        altrimenti {
            segnala l'errore
            azzera nuovamente l
            chiede di ripetere l'immissione della password
        }
        
        se l<lMin {
            segnala l'errore
            azzera nuovamente l
            chiede di ripetere l'immissione della password
        }
    }
}

(a questo punto la password di lunghezza l compresa tra lMin e
 lMax e' in s, ma va aggiunto in coda il classico terminatore '{parsed_message}')


Il tutto potrebbe essere "inglobato" in una funzione con un prototipo tipo questo:

void rilevamento_password( char *password, size_t lMin, size_t lMax );

Da chiamare, ovviamente, assicurandosi che l'array puntato dal parametro password possa contenere almeno lMax+1 caratteri.')


Il tutto potrebbe essere "inglobato" in una funzione con un prototipo tipo questo:

void rilevamento_password( char *password, size_t lMin, size_t lMax );

Da chiamare, ovviamente, assicurandosi che l'array puntato dal parametro password possa contenere almeno lMax+1 caratteri.
Ultima modifica effettuata da AldoBaldo 21/10/20 12:41
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.