[C] Controllo dimensione massima di un input

di il
1 risposte

[C] Controllo dimensione massima di un input

Salve, prometto che a breve smetterò di smetterla di "intasare" questa sezione del forum

Arriviamo al punto. Nel programma che sto realizzando, dal terminale vengono richiesti dei dati (nome, cognome, numero di telefono...) che devono essere lunghi MASSIMO 15 caratteri, e se si sfora tale limite l'input viene richiesto nuovamente, a loop. I dati corretti infine vengono inseriti in una struct:

typedef struct ElencoTelefonico{
	char name[SIZE];
	char surname[SIZE];
	char numeroTelefono[SIZE];
}ElencoTelefonico;
Allora ho creato una funzione che prende in input un char temp[MAX_SIZE] ed un int flag.
MAX_SIZE è di 1024 e il flag mi server per capire che cosa sto chiedendo (nome, cognome.. numero).

allora ad esempio ho questo:

int aggiungiRecord(int sock) {
	
	ElencoTelefonico elenco;
	
	char name_temp[MAX_SIZE];
	char surname_temp[MAX_SIZE];
	char numtel_temp[MAX_SIZE];
	
	verificaInput(name_temp,1);
	printf("\n");
	verificaInput(surname_temp,2);
	printf("\n");
	verificaInput(numtel_temp,3);
	printf("\n");
	
	strcpy(elenco.name, name_temp);
	strcpy(elenco.surname, surname_temp);
	strcpy(elenco.numeroTelefono, numtel_temp);
...
verificaInput:

void verificaInput(char temp[MAX_SIZE], int flag) {
	
	int testscanf;
	
	if(flag == 1) {
		printf("\nInserisci il nome: ");
	}
	if(flag == 2) {
		printf("\nInserisci il cognome: ");
	}
	if(flag == 3) {
		printf("\nInserisci il numero di telefono: ");
	}
	
	do {
		testscanf = scanf("%s", temp);
		while(testscanf == -1) {
			if(errno != EINTR) {
                printf("\nErrore scanf\n");
                exit(0);
            }
            else {
                testscanf = scanf("%s", temp);
            }
        }
        if(testscanf == 0 || strlen(temp) > 15){ 
            while(scanf("%*[^\n]") == -1){ 
                if(errno != EINTR){
                    printf("\nErrore scanf\n");
                    exit(0);
                }
            }
            memset(temp,0,sizeof(temp));
            printf("\nErrore, lunghezza massima pari a 15 caratteri!\n");
            if(flag == 1) {
				printf("\nInserisci il nome: ");
			}
			if(flag == 2) {
				printf("\nInserisci il cognome: ");
			}
			if(flag == 3) {
				printf("\nInserisci il numero di telefono: ");
			}
        }
	}while(testscanf == 0 || strlen(temp) > 15);
	
	return;
}
Questo codice non si comporta come dovrebbe.. se ad esempio inserisco un nome più lungo
di 15 caratteri avviene correttamente la stampa di "Errore, lunghezza massima pari a 15 caratteri!" ma invece di ricominciare con il ciclo per il nome, mi fa l'inserimento del cognome e così via.. come se uscisse dal ciclo. Dove sto sbagliando? Grazie

1 Risposte

  • Re: [C] Controllo dimensione massima di un input

    Ti stai complicando terribilmente la vita.

    Se vuoi porre un limite:
    
    char *get_nstring (int length)
    {
     char *l_str;
     int mem;
    
     l_str = (char *) malloc (length * sizeof (char));
     for ( mem = 1; mem <= length; mem++ ) {
           l_str[mem - 1] = getchar ();
     }
     l_str[mem - 1] = '\0';
    
     while ( getchar () != '\n');
    
     return l_str;
    }
    
    Quindi durante il tuo programma:
    
     nome = get_nstring (15);
     cognome = get_nstring (20);
     
     /* fai qualcosa con i dati */
    
     free (nome);
     free (cognome);
    
Devi accedere o registrarti per scrivere nel forum
1 risposte