Piccolo problema in c

di il
13 risposte

Piccolo problema in c

Ciao a tutti...mi sono bloccato in una cosa
sto "cercando" di creare un programma che dato un numero di utenti mi deve generare le generalità di ogni utente e attraverso un menu devo scegliere se la password dovra essere impostata manualmente o automatica(utilizzando 3 diversi criteri)
il problema sta che selezionando l'opzione di generazione automatica della password la stampa ignorando i requisiti impostanti.

#include "stdio.h"
#include "stdlib.h"
#include "time.h"


#include "string.h"
#include "ctype.h"






#define UTENTI 1
#define LUNGHEZZA_CARETTERI 25
#define LUNGHEZZA_INDIRIZZO 45
#define LUNGHEZZA_EMAIL 75
#define LUNGHEZZA_DOMINI 7










typedef struct {
	int giorno;
	int mese;
	int anno;
}data;


typedef struct {
	char nome[LUNGHEZZA_CARETTERI+1];
	char cognome[LUNGHEZZA_CARETTERI+1];
	data datanascita;
	char password[8];
	char passwordtemp[8];
}utenti;






//funzioni
void generaAnagrafica(utenti account[]);
void generaPassword_automatica_livello1(utenti account[]);
void generaPassword_automatica_livello2(utenti account[]);
void generaPassword_automatica_livello3(utenti account[]);
void stampaDatiCompleti(utenti accounts[]);




int main(){
	setvbuf(stdout, NULL, _IONBF, 0);


	utenti anagrafica[UTENTI];
	for (int i=0; i<UTENTI; i++){
		generaAnagrafica(anagrafica);
		printf("\n%d° ACCOUNT: \n", i + 1);
		printf(" COGNOME: %s\n", anagrafica[i].cognome);
			printf(" NOME: %s\n", anagrafica[i].nome);


			printf("DATA DI NASCITA: ");
					 if(anagrafica[i].datanascita.giorno < 10){
						 printf("\t0%d\\", anagrafica[i].datanascita.giorno);
						}else
						{
							printf("\t%d\\", anagrafica[i].datanascita.giorno);
						}
					 if(anagrafica[i].datanascita.mese < 10){
					 			 printf("0%d\\", anagrafica[i].datanascita.mese);
					 			}else
					 			{
					 				printf("%d\\", anagrafica[i].datanascita.mese < 10);
					 			}
			printf("%d\n", anagrafica[i].datanascita.anno);


			char scelta[2];
			char sceltaSicurezza[2];
			do{
						printf("1) Generare la password in automatico\n");
						printf("2) Inserire la password manualmente\n");
						printf("Effettui una scelta (1 o 2): ");
						puts("\n*****************************************");
						scanf("%s", scelta);
					}while(strcmp(scelta,"1") && strcmp(scelta,"2"));
			if (strcmp(scelta,"1") == 0) {	//inserimento automatico
				do{
					printf("\nSelezionare il livello di complessita'\n");
					printf("1) Poco sicura\n");
					printf("2) Mediamente sicura\n");
					printf("3) Sicura\n");
					printf("Effettui una scelta: ");
					scanf("%s", sceltaSicurezza);
				}while(strcmp(sceltaSicurezza,"1") && strcmp(sceltaSicurezza,"2") && strcmp(sceltaSicurezza,"3"));


				printf("Password generata: ");


				if(strcmp(sceltaSicurezza,"1") == 0){


					generaPassword_automatica_livello1(anagrafica);






				} else if(strcmp(sceltaSicurezza,"2") == 0){


				//	 generaPassword_automatica_livello2(anagrafica);


				}else if (strcmp(sceltaSicurezza,"3") == 0){


				//	 generaPassword_automatica_livello3(anagrafica);


				}
			} else if (strcmp(scelta,"2") == 0) {	//inserimento a mano
				printf("passwird generata manualmente");
					}




			//generaPassword_automatica_livello1(anagrafica);


				for (int j=0; j<8; j++){
			printf("%c", anagrafica[i].password[j]);




			}




	}




	 // stampaDatiCompleti(anagrafica);
	return 0;
}


void generaAnagrafica(utenti account[]){




int seed = (time(NULL));
	srand(seed);
	// randomizzo nomi, cognomi, indirizzo e email
	char* nomi [] = {"ALESSANDRO", "GIACOMO", "ALESSIO", "ANTONIO", "CARLO", "FABIO", "ALESSANDRA", "GIACOMA", "ALESSIA", "ANTONIA", "CARLA", "FABIA"};
	char* cognomi [] = {"ROSSI", "BIANCHI", "NEGRO", "RIZZI", "CAMPESE", "IODICE", "ROSSIA", "BIANCHIA", "NEGROA", "RIZZIA", "CAMPESEA", "IODICEA"};
	 char* email[] = {"@gmail.com", "@gmail.it", "@hotmail.it", "@hotmail.it", "@aruba.it", "@aruba.com", "@libero.it"};


int i;
	for ( i=0; i<UTENTI; i++){
	// RANDOM NOMI
	int indice_nomi = 0;
	indice_nomi = rand () % UTENTI;
	strcpy(account[i].nome, nomi[indice_nomi]);


	//RANDOM COGNOMI
	int indice_cognomi = 0;
	indice_cognomi = rand () % UTENTI;
	strcpy(account[i].cognome, cognomi[indice_cognomi]);


	account[i].datanascita.anno = rand () % (2019 - 1950) + 1950;
			account[i].datanascita.mese = rand () % (12 - 01) + 01;
				if(account[i].datanascita.mese < 10){


				}


			if (account[i].datanascita.mese==2 && account[i].datanascita.anno%400==0 ||  (account[i].datanascita.anno%4==0 &&!(account[i].datanascita.anno%100==0))){
			account[i].datanascita.giorno = rand () % (29 - 01) + 01;
		}
			else if (account[i].datanascita.mese==2){
				account[i].datanascita.giorno = rand () % (28 - 01) + 01;
			}
			else if (account[i].datanascita.mese==1 || account[i].datanascita.mese==3 || account[i].datanascita.mese==5 || account[i].datanascita.mese==7 || account[i].datanascita.mese==8 || account[i].datanascita.mese==10){
				account[i].datanascita.giorno = rand () % (31 - 01) + 01;
			}
			else {
				account[i].datanascita.giorno = rand () % (30 - 01) + 01;
			}
			int  passwordrequisiti = 0;








	}
}


	void generaPassword_automatica_livello1(utenti account[]){




int  passwordrequisiti;






	int i,j;
	setvbuf(stdout, NULL, _IONBF, 0);






	do {




	for(i=0; i< 2; i++){


		for(j=0; j< 8; j++){


	  		passwordrequisiti = 0;


			do{
		 		account[i].passwordtemp[j] = '!' + rand() % 'z';
		  		if ((account[i].passwordtemp[j] >='!' && account[i].passwordtemp[j]< '&')
				||(account[i].passwordtemp[j] >='?' && account[i].passwordtemp[j]< '@')
				||(account[i].passwordtemp[j] >='0' && account[i].passwordtemp[j]< '9')
				||(account[i].passwordtemp[j] >='a' && account[i].passwordtemp[j]< 'z')
				||(account[i].passwordtemp[j] >='A' && account[i].passwordtemp[j]< 'Z'))
				passwordrequisiti++;
			} while(passwordrequisiti==0);
	//	printf("%c", account[i].passwordtemp[j]);
		} //printf("\n");
	}


	//printf("\n\n");


int caratteri_numerici = 0;
int caratteri_speciali = 0;
int somma_caratteri_numerici_speciali = 0;


	for(i=0; i< 2; i++){
		for(j=0; j< 8; j++){


			if (isdigit(account[i].passwordtemp[j])) {
				caratteri_numerici++;
				somma_caratteri_numerici_speciali++;
			} else if (ispunct(account[i].passwordtemp[j])) {
				caratteri_speciali++;
				somma_caratteri_numerici_speciali++;
				}
			}}


	if (somma_caratteri_numerici_speciali > 5) {


		passwordrequisiti++;


		printf("Rispettano i requisiti :\n");
		for(i=0; i< 2; i++){
			for(j=0; j< 8; j++){
			account[i].password[j] = account[i].passwordtemp[j];
				//printf("%c", account[i].password[j]);


			}
		printf("\n");
		}
	}


	} while(passwordrequisiti==1);




}

13 Risposte

  • Re: Piccolo problema in c

    Attenzione ... hai impostato

    UTENTI 1

    ma in molte parti del codice utilizzi cicli che non rispettano il limite della costante UTENTI e vai oltre il buffer impostato creando situazioni imprevedibili.
  • Re: Piccolo problema in c

    E per quello fa quel problema?
  • Re: Piccolo problema in c

    Se scrivi in memoria oltre il consentito non si sa quello che può succedere. Prima di continuare devi assolutamente correggere e poi si vede.
  • Re: Piccolo problema in c

    
    #include "stdio.h"
    #include "stdlib.h"
    #include "time.h"
    
    #include "string.h"
    #include "ctype.h"
    
    
    
    #define UTENTI 2
    #define LUNGHEZZAPASS 8
    #define LUNGHEZZA_CARETTERI 25
    #define LUNGHEZZA_INDIRIZZO 45
    #define LUNGHEZZA_EMAIL 75
    #define LUNGHEZZA_DOMINI 7
    
    
    
    
    
    typedef struct {
    	int giorno;
    	int mese;
    	int anno;
    }data;
    
    typedef struct {
    	char nome[LUNGHEZZA_CARETTERI+1];
    	char cognome[LUNGHEZZA_CARETTERI+1];
    	data datanascita;
    	char password[8];
    	char passwordef[8];
    	char passwordtemp[8];
    }utenti;
    
    
    
    //funzioni
    void generaAnagrafica(utenti account[]);
    void generaPassword_automatica_livello1(utenti account[]);
    void passwird_generata_manualmente(utenti account[]);
    //void generaPassword_automatica_livello2(utenti account[]);
    //void generaPassword_automatica_livello3(utenti account[]);
    void stampaDatiCompleti(utenti accounts[]);
    
    
    int main(){
    	setvbuf(stdout, NULL, _IONBF, 0);
    
    	utenti anagrafica[UTENTI];
    	for (int i=0; i<UTENTI; i++){
    		generaAnagrafica(anagrafica);
    		printf("\n%d° ACCOUNT: \n", i + 1);
    		printf(" COGNOME: %s\n", anagrafica[i].cognome);
    			printf(" NOME: %s\n", anagrafica[i].nome);
    
    			printf("DATA DI NASCITA: ");
    					 if(anagrafica[i].datanascita.giorno < 10){
    						 printf("\t0%d\\", anagrafica[i].datanascita.giorno);
    						}else
    						{
    							printf("\t%d\\", anagrafica[i].datanascita.giorno);
    						}
    					 if(anagrafica[i].datanascita.mese < 10){
    					 			 printf("0%d\\", anagrafica[i].datanascita.mese);
    					 			}else
    					 			{
    					 				printf("%d\\", anagrafica[i].datanascita.mese < 10);
    					 			}
    			printf("%d\n", anagrafica[i].datanascita.anno);
    
    			char scelta[2];
    			char sceltaSicurezza[2];
    			do{
    						printf("1) Generare la password in automatico\n");
    						printf("2) Inserire la password manualmente\n");
    						printf("Effettui una scelta (1 o 2): ");
    						puts("\n*****************************************");
    						scanf("%s", scelta);
    					}while(strcmp(scelta,"1") && strcmp(scelta,"2"));
    			if (strcmp(scelta,"1") == 0) {	//inserimento automatico
    				do{
    					printf("\nSelezionare il livello di complessita'\n");
    					printf("1) Poco sicura\n");
    					//printf("2) Mediamente sicura\n");
    					//printf("3) Sicura\n");
    					printf("Effettui una scelta: ");
    					scanf("%s", sceltaSicurezza);
    				}while(strcmp(sceltaSicurezza,"1") && strcmp(sceltaSicurezza,"2") && strcmp(sceltaSicurezza,"3"));
    
    				printf("Password generata: ");
    
    				if(strcmp(sceltaSicurezza,"1") == 0){
    
    					 generaPassword_automatica_livello1(anagrafica);
    
    
    
    				} else if(strcmp(sceltaSicurezza,"2") == 0){
    
    				//	 generaPassword_automatica_livello2(anagrafica);
    
    				}else if (strcmp(sceltaSicurezza,"3") == 0){
    
    				//	 generaPassword_automatica_livello3(anagrafica);
    
    				}
    			} else if (strcmp(scelta,"2") == 0) {	//inserimento a mano
    				passwird_generata_manualmente(anagrafica);
    					}
    
    
    			//generaPassword_automatica_livello1(anagrafica);
    
    				for (int j=0; j<LUNGHEZZAPASS; j++){
    			printf("%c", anagrafica[i].password[j]);
    
    
    			}
    
    
    	}
    
    
    	 // stampaDatiCompleti(anagrafica);
    	return 0;
    }
    
    void generaAnagrafica(utenti account[]){
    
    
    int seed = (time(NULL));
    	srand(seed);
    	// randomizzo nomi, cognomi, indirizzo e email
    	char* nomi [] = {"ALESSANDRO", "GIACOMO", "ALESSIO", "ANTONIO", "CARLO", "FABIO", "ALESSANDRA", "GIACOMA", "ALESSIA", "ANTONIA", "CARLA", "FABIA"};
    	char* cognomi [] = {"ROSSI", "BIANCHI", "NEGRO", "RIZZI", "CAMPESE", "IODICE", "ROSSIA", "BIANCHIA", "NEGROA", "RIZZIA", "CAMPESEA", "IODICEA"};
    	 char* email[] = {"@gmail.com", "@gmail.it", "@hotmail.it", "@hotmail.it", "@aruba.it", "@aruba.com", "@libero.it"};
    
    int i;
    	for ( i=0; i<UTENTI; i++){
    	// RANDOM NOMI
    	int indice_nomi = 0;
    	indice_nomi = rand () % 12;
    	strcpy(account[i].nome, nomi[indice_nomi]);
    
    	//RANDOM COGNOMI
    	int indice_cognomi = 0;
    	indice_cognomi = rand () % 12;
    	strcpy(account[i].cognome, cognomi[indice_cognomi]);
    
    	account[i].datanascita.anno = rand () % (2019 - 1950) + 1950;
    			account[i].datanascita.mese = rand () % (12 - 01) + 01;
    				if(account[i].datanascita.mese < 10){
    
    				}
    
    			if (account[i].datanascita.mese==2 && account[i].datanascita.anno%400==0 ||  (account[i].datanascita.anno%4==0 &&!(account[i].datanascita.anno%100==0))){
    			account[i].datanascita.giorno = rand () % (29 - 01) + 01;
    		}
    			else if (account[i].datanascita.mese==2){
    				account[i].datanascita.giorno = rand () % (28 - 01) + 01;
    			}
    			else if (account[i].datanascita.mese==1 || account[i].datanascita.mese==3 || account[i].datanascita.mese==5 || account[i].datanascita.mese==7 || account[i].datanascita.mese==8 || account[i].datanascita.mese==10){
    				account[i].datanascita.giorno = rand () % (31 - 01) + 01;
    			}
    			else {
    				account[i].datanascita.giorno = rand () % (30 - 01) + 01;
    			}
    			int  passwordrequisiti = 0;
    
    
    
    
    	}
    }
    
    	void passwird_generata_manualmente(utenti account[]){
    
    
    		int numero = 0;
    					int maiuscola, speciale, somma = 0;
    					int corretto= 0;
    					int lunghezza;
    				//	char password[8];
    					int i, j;
    	//	for (int i=0; i<2; i++){
    					char password[8];
    								numero = 0;
    								maiuscola = 0;
    
    								do{
    									printf("Inserisci la password: ");
    									scanf("%s", password);
    									int lunghezza = strlen(password);
    
    									if (lunghezza == 8) {
    										for (int i = 0; i < LUNGHEZZAPASS; i++) {
    											//controllo se è presente almeno un numero o una maiuscola
    											if (isdigit(password)) {
    												numero++;
    											} else if (isupper(password)) {
    												maiuscola++;
    											}
    										}
    										if (numero > 0 && maiuscola > 0) {
    											//copio la password in accounts[i]
    										for(int j = 0; j < LUNGHEZZAPASS; j++){
    											strcpy(account[i].password[j], password);
    										}
    
    											corretto++;
    
    										} else {
    											printf("La password non contiene un numero o una lettera maiuscola\n");
    										}
    									} else {
    										printf("La password deve essere di 8 caratteri\n");
    									}
    								}while (corretto ==0);
    
    	}
    
    	void generaPassword_automatica_livello1(utenti account[]){
    
    
    
    
    	int  passwordrequisiti;
    
    
    
    
    
    
    		int i,j;
    
    
    
    
    
    
    		do {
    
    
    
    
    		for(i=0; i< UTENTI; i++){
    
    
    			for(j=0; j< LUNGHEZZAPASS; j++){
    
    
    		  		passwordrequisiti = 0;
    
    
    				do{
    			 		account[i].passwordtemp[j] = '!' + rand() % 'z';
    			  		if ((account[i].passwordtemp[j] >='!' && account[i].passwordtemp[j]< '&')
    					||(account[i].passwordtemp[j] >='?' && account[i].passwordtemp[j]< '@')
    					||(account[i].passwordtemp[j] >='0' && account[i].passwordtemp[j]< '9')
    					||(account[i].passwordtemp[j] >='a' && account[i].passwordtemp[j]< 'z')
    					||(account[i].passwordtemp[j] >='A' && account[i].passwordtemp[j]< 'Z'))
    					passwordrequisiti++;
    				} while(passwordrequisiti==0);
    		//	printf("%c", account[i].passwordtemp[j]);
    			} //printf("\n");
    		}
    
    
    		//printf("\n\n");
    
    
    	int caratteri_numerici = 0;
    	int caratteri_speciali = 0;
    	int somma_caratteri_numerici_speciali = 0;
    
    
    		for(i=0; i< UTENTI; i++){
    			for(j=0; j< LUNGHEZZAPASS; j++){
    
    
    				if (isdigit(account[i].passwordtemp[j])) {
    					caratteri_numerici++;
    					somma_caratteri_numerici_speciali++;
    				} else if (ispunct(account[i].passwordtemp[j])) {
    					caratteri_speciali++;
    					somma_caratteri_numerici_speciali++;
    					}
    				}}
    
    
    		if (somma_caratteri_numerici_speciali > 5) {
    
    
    			passwordrequisiti++;
    
    
    			printf("Rispettano i requisiti :\n");
    			for(i=0; i< UTENTI; i++){
    				for(j=0; j< LUNGHEZZAPASS; j++){
    				account[i].password[j] = account[i].passwordtemp[j];
    					//printf("%c", account[i].password[j]);
    
    
    				}
    			printf("\n");
    			}
    		}
    
    
    		} while(passwordrequisiti==1);
    
    
    
    
    	}
    
    
    il codice lo corretto, ho inserito anche il codice per l'inserimento manuale della password e dopo che la condizione è vera invece di proseguire...termina
  • Re: Piccolo problema in c

    Guarda che una stringa in C è terminata da un carattere NULL.

    Se scrivi

    char password[8];

    allora la password potrà essere al massimo di 7 caratteri dato che l'ottavo sarà il NULL.

    Se vuoi mettere 8 caratteri in una stringa devi scrivere

    char password[9];

    Inoltre funzioni come

    isdigit

    isupper

    accettano (e trattano) singoli char e non stringhe di char. La variabile password non è un char ma un puntatore ad una stringa.

    Scusa ma tu li leggi gli ERRORI/AVVISI che ti dà il compilatore?
  • Re: Piccolo problema in c

    Quindi devo aumentare di uno la dimensione? e come posso contare quanti caratteri numerici\cifre ecc? ti dico questo perchè se non utilizzo la funzione va
  • Re: Piccolo problema in c

    Mi pare di essere stato chiaro ... che dirti?
  • Re: Piccolo problema in c

    Si ma non so come muovermi
  • Re: Piccolo problema in c

    Mi hai chiesto "devo aumentare di uno ..." e io ti avevo detto devi usare char password[9];

    Ti ho detto che password è un puntatore a stringa quindi dovrai controllare password[ i ] per controllare ogni carattere da 0 a 7 ...

    Le stringhe le avete studiate in C?
  • Re: Piccolo problema in c

    Ho incrementato di uno la dimensione ma fa la stessa cosa... nella password manuale si blocca quando deve copiare il contenuto di password in account.password
  • Re: Piccolo problema in c

    Account.password di quanti caratteri è? In quale linea sta questa copia?
  • Re: Piccolo problema in c

    8+1...sta nella riga 208....
  • Re: Piccolo problema in c

    Le linee
    
    for(int j = 0; j < LUNGHEZZAPASS; j++){
    	strcpy(account[i].password[j], password);
    }
    
    non hanno senso. Forse non hai capito come lavora la funzione strcpy.
    Devi sostituire le tre righe con questa unica riga
    
    	strcpy(account[i].password, password);
    
Devi accedere o registrarti per scrivere nel forum
13 risposte