Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - aiuto perfavore
Forum - C/C++ - aiuto perfavore

Avatar
prdsgl (Normal User)
Newbie


Messaggi: 1
Iscritto: 19/10/2020

Segnala al moderatore
Postato alle 18:04
Lunedì, 19/10/2020
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

PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 700
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 22:14
Lunedì, 19/10/2020
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.
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 0:55
Martedì, 20/10/2020
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 il 20/10/2020 alle 1:18


in programmazione tutto è permesso
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6403
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 10:38
Martedì, 20/10/2020
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 il 20/10/2020 alle 10: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à.
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 15:08
Martedì, 20/10/2020

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.



https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 16:47
Martedì, 20/10/2020
Testo quotato

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
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 700
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 14:37
Mercoledì, 21/10/2020
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:

Codice sorgente - presumibilmente C/C++

  1. ho un lMin che mi da' la lunghezza minima della password
  2. ho un lMax che mi da' la lunghezza massima della password
  3. ho un array di char s con una capacita' di almeno lMax+1 elementi
  4. predispongo una variabile l per la lunghezza della password (inizialmente 0)
  5.  
  6. fintanto che l<lMin {
  7.     fintanto che getch() non rileva un "a capo" {
  8.         se l<=lMax {
  9.             mostra '*'
  10.         }
  11.         altrimenti {
  12.             segnala l'errore
  13.             azzera nuovamente l
  14.             chiede di ripetere l'immissione della password
  15.         }
  16.        
  17.         se l<lMin {
  18.             segnala l'errore
  19.             azzera nuovamente l
  20.             chiede di ripetere l'immissione della password
  21.         }
  22.     }
  23. }
  24.  
  25. (a questo punto la password di lunghezza l compresa tra lMin e
  26.  lMax e' in s, ma va aggiunto in coda il classico terminatore '\0')



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 il 21/10/2020 alle 14: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.
PM Quote