Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [C] Controllo dimensione massima di un input

    Salve gente

    Nel codice che sto cercando di sviluppare devo inserire dei dati da terminali e successivamente salvarli in una struct. Prima di fare ciò però devo controllare che tali dati non siano più lunghi di 15 caratteri. Se superano i 15 caratteri l'input viene nuovamente richiesto a loop.
    Ho buttato giù questo codice, che non si comporta a dovere. Basta compilare ed avviare provando a scrivere dati più lunghi di 15 caratteri per rendersene facilmente conto

    codice:
    #include <unistd.h>
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <fcntl.h>
    
    #define MAX_SIZE 1024
    #define SIZE 15
    
    typedef struct ElencoTelefonico{
    	char name[SIZE];
    	char surname[SIZE];
    	char numeroTelefono[SIZE];
    }ElencoTelefonico;
    
    void verificaInput(ElencoTelefonico record, int flag);
    
    int main(int argc, char**argv) {
    	
    	ElencoTelefonico record;
    	
    	verificaInput(record,1);
    	verificaInput(record,2);
    	verificaInput(record,3);
    	
    	printf("Nome: %s",record.name);
    	printf("Cognome: %s",record.surname);
    	printf("Numero: %s", record.numeroTelefono);
    	
    	return 1;
    }
    
    void verificaInput(ElencoTelefonico record, int flag) {
    	
    	char temp[MAX_SIZE];
    	memset(temp,0,MAX_SIZE);
    	
    	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 {
    				memset(temp,0,MAX_SIZE);
                    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,MAX_SIZE);
                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);
    	
    	if(flag == 1) {
    		strcpy(record.name,temp);
    	}
    	if(flag == 2) {
    		strcpy(record.surname,temp);
    	}
    	if(flag == 3) {
    		strcpy(record.numeroTelefono,temp);
    	}
    	
    	return;
    }
    Cosa sbaglio? Grazie

  2. #2
    Utente di HTML.it L'avatar di Dark867
    Registrato dal
    Mar 2010
    Messaggi
    435
    Per conoscere la dimensione di una stringa basta che usi la funzione strlen, inoltre in verify fai un casino esagerato, usa semplicemente una cosa come
    codice:
    do{
    //qua chiedi di inserire l'input e lo salvi in 3 buffer temporanei
    
    if(strlen(buffer1)>SIZE)
    printf("nome troppo lungo");
    if(strlen(buffer2)>SIZE)
    printf("cognome troppo lungo");
    if(strlen(buffer3)>SIZE)
    printf("telefono troppo lungo");
    }while( (strlen(buffer1) >SIZE) || (strlen(buffer2) > SIZE) || (strlen(buffer3) > SIZE));
    
    //qui con strcpy inserisci l'input nei campi della rubrica
    Nota che gli array della rubrica devono avere dimensione pari a SIZE+1 , +1 perché devi contare anche il carattere di terminazione (invisibile) presente in ogni stringa.

  3. #3
    Ah ok grazie

    Così pare che funziona!!!

    codice:
    #include <unistd.h>
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <fcntl.h>
    
    #define SIZE 15
    
    typedef struct ElencoTelefonico{
    	char name[SIZE];
    	char surname[SIZE];
    	char numeroTelefono[SIZE];
    }ElencoTelefonico;
    
    void verificaInput(ElencoTelefonico record);
    
    int main(int argc, char**argv) {
    	
    	ElencoTelefonico record;
    	
    	verificaInput(record);
    	
    	printf("Nome: %s",record.name);
    	printf("Cognome: %s",record.surname);
    	printf("Numero: %s", record.numeroTelefono);
    	
    	return 1;
    }
    
    void verificaInput(ElencoTelefonico record) {
    	
    	char name_temp[SIZE+1];
    	char surname_temp[SIZE+1];
    	char numero_temp[SIZE+1];
    	
    	do {
    		printf("\nInserisci il nome: ");
    		scanf("%s", name_temp);
    		printf("\nInserisci il cognome: ");
    		scanf("%s",surname_temp);
    		printf("\nInserisci il numero di telefono: ");
    		scanf("%s",numero_temp);
    		
    		if(strlen(name_temp) > SIZE) {
    			printf("\nNome troppo lungo!\n");
    		}
    		if(strlen(surname_temp) > SIZE) {
    			printf("\nCognome troppo lungo!\n");
    		}
    		if(strlen(numero_temp) > SIZE) {
    			printf("\nNumero troppo lungo!\n");
    		}
    	}while((strlen(name_temp) > SIZE) || (strlen(surname_temp) > SIZE) || (strlen(numero_temp) > SIZE));
    	
    	strcpy(record.name,name_temp);
    	strcpy(record.surname,surname_temp);
    	strcpy(record.numeroTelefono,numero_temp);
    	
    	return;
    }
    Può sempre essere utile a qualcun'altro

    Edit:Le printf stampano una roba strana O.o

  4. #4
    Utente di HTML.it L'avatar di Dark867
    Registrato dal
    Mar 2010
    Messaggi
    435
    Il return; alla fine di una funzione void lo fanno i vecchietti che hanno iniziato a programmare in C negli anni '50, levaloXD
    Che tipo di roba strana?

  5. #5
    Per la precisione nel nome stampa sempre roba diversa.. qualche lettera dell'alfabeto in maiuscolo
    mischiata a quadrati con numeretti dentro, fino a | e rombi con punti interrogativi dentro XD
    Cognome e Numero risultano vuoti.

    Edit: Ho fatto le stampe dei buffer prima delle strcpy e contengono i dati corretti. Non capisco.

    Edit2: Ho provato a sostituire le strcpy con memcpy senza risultati.

  6. #6
    Scusate il doppio post ma ho risolto così:

    codice:
    #include <unistd.h>
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <fcntl.h>
    
    #define SIZE 15
    
    typedef struct ElencoTelefonico{
    	char name[SIZE];
    	char surname[SIZE];
    	char numeroTelefono[SIZE];
    }ElencoTelefonico;
    
    void verificaInput(ElencoTelefonico* record);
    
    int main(int argc, char**argv) {
    	
    	ElencoTelefonico* record = (ElencoTelefonico*)malloc(sizeof(ElencoTelefonico));
    	
    	verificaInput(record);
    	
    	printf("Nome: %s\n",record->name);
    	printf("Cognome: %s\n",record->surname);
    	printf("Numero: %s\n",record->numeroTelefono);
    	
    	return 1;
    }
    
    void verificaInput(ElencoTelefonico* record) {
    	
    	char name_temp[SIZE+1];
    	char surname_temp[SIZE+1];
    	char numero_temp[SIZE+1];
    	
    	int testscanf;
    	
    	do {
    		
    		memset(name_temp,0,sizeof(name_temp));
    		memset(surname_temp,0,sizeof(surname_temp));
    		memset(numero_temp,0,sizeof(numero_temp));
    		
    		printf("\nInserisci il nome: ");
    		testscanf = scanf("%s", name_temp);
    		while(testscanf == -1) {
    			if(errno != EINTR) {
    				printf("\nErrore scanf in menu\n");
    					exit(0);
    			}
    			else {
    				testscanf = scanf("%s",name_temp);
    			}
    		}
    		
    		printf("\nInserisci il cognome: ");
    		scanf("%s",surname_temp);
    		while(testscanf == -1) {
    			if(errno != EINTR) {
    				printf("\nErrore scanf in menu\n");
    					exit(0);
    			}
    			else {
    				testscanf = scanf("%s",surname_temp);
    			}
    		}
    		
    		printf("\nInserisci il numero di telefono: ");
    		scanf("%s",numero_temp);
    		while(testscanf == -1) {
    			if(errno != EINTR) {
    				printf("\nErrore scanf in menu\n");
    					exit(0);
    			}
    			else {
    				testscanf = scanf("%s",numero_temp);
    			}
    		}
    		
    		if(strlen(name_temp) > SIZE) {
    			printf("\nNome troppo lungo!\n");
    		}
    		if(strlen(surname_temp) > SIZE) {
    			printf("\nCognome troppo lungo!\n");
    		}
    		if(strlen(numero_temp) > SIZE) {
    			printf("\nNumero troppo lungo!\n");
    		}
    	}while(testscanf == 0 || (strlen(name_temp) > SIZE) || (strlen(surname_temp) > SIZE) || (strlen(numero_temp) > SIZE));
    	
    	strcpy(record->name, name_temp);
    	strcpy(record->surname, surname_temp);
    	strcpy(record->numeroTelefono, numero_temp);
    }
    Per la precisione.. cos'è che deve essere grande SIZE+1? Solo i buffer temporanei, gli array dentro la struct o entrambi?

  7. #7
    Utente di HTML.it L'avatar di Dark867
    Registrato dal
    Mar 2010
    Messaggi
    435
    Gli array dentro la struct, i buffer temporanei sono già grandi a sufficienza direi!

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.