PDA

Visualizza la versione completa : [C] Controllo dimensione massima di un input


Javino89
13-08-2012, 10:35
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 :)



#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 :)

Dark867
13-08-2012, 11:17
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


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.

Javino89
13-08-2012, 11:42
Ah ok grazie :)

Così pare che funziona!!!



#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

Dark867
13-08-2012, 12:30
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?

Javino89
13-08-2012, 16:00
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.

Javino89
13-08-2012, 16:45
Scusate il doppio post ma ho risolto così:



#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?

Dark867
13-08-2012, 20:43
Gli array dentro la struct, i buffer temporanei sono già grandi a sufficienza direi!

Loading