C - Controllo inserimento valore in struttura

Stefanokj

Utente Attivo
320
7
OS
Arch
Ciao ragazzi, sto realizzando un programmino che tramite una procedura mi consenta di inserire dei valori all'interno di una struttura.
Questo è parte del codice (ho messo solo le cose più importanti):
C:
typedef struct{
    char name[DIM];
    char color[6+1];       //6 caratteri per il colore 1 per il terminatore di stringa
    char color2[6+1];
    }Record;
   
int main() {
    Record subj;
    insRecord(&subj);
}

void insRecord(Record *subj){
    printf("\nName ");
    scanf("%64[^\n]s", subj->name);
    cleanBuffer();
    printf("\nColor ");
    scanf("%s", subj->color);
    checkInput();
    cleanBuffer();
  
    printf("\nColor2 ");
    scanf("%s", subj->color2);
    checkInput();
    cleanBuffer();
}

int cleanBuffer(){
    int cont= 0;
    char c;
    do{
        cont++;
        c = getchar();
    }while(c != '\n');
    return cont;
}

Per l'inserimento del nome non ci sono problemi, visto che non devo fare nessun controllo, invece per il colore devo controllare che sia scritto in esadecimale, per far ciò vorrei utilizzare una funzioncina.
stavo pensando di farla in questo modo:

C:
checkInput(char *i){
        int cont=0;
        for (;cont<6;){
            if (i[cont] >= 'A' && i[cont] <= 'F' || i[cont] >= 'a' && i[cont] <= 'f'
            || i[cont] >= 0 && i[cont] <= 9)
                cont++;
            else {
                printf("\nHai inserito un carattere non valido: %s", i[cont]);
                return 0;
            }
        }
}

Il problema è che non so come prendere il valore appena preso in input e passarlo alla funzione checkInput, ho delle difficoltà con i puntatori :(
 

bigendian

Utente Attivo
271
125
OS
Linux forever, freedom
1) a cosa ti serve cleanBuffer(); ? Non fa nulla se non contare la lunghezza, lavoro del tutto inutile.
scanf legge senza '\n', la stringa letta e' gia apposto, zero-terminata, lunghezza se ti serve usa strlen().

2) passa subj->color2 a checkInput

checkInput(subj->color2);
 

Stefanokj

Utente Attivo
320
7
OS
Arch
1) a cosa ti serve cleanBuffer(); ? Non fa nulla se non contare la lunghezza, lavoro del tutto inutile.
scanf legge senza '\n', la stringa letta e' gia apposto, zero-terminata, lunghezza se ti serve usa strlen().
Serve a svuotare il buffer tra ogni scanf di stringhe, così che il 'tasto invio' non crei problemi nei successivi scan.
2) passa subj->color2 a checkInput
checkInput(subj->color2);
Ho già provato ma non funziona :(
 

bigendian

Utente Attivo
271
125
OS
Linux forever, freedom
Serve a svuotare il buffer tra ogni scanf di stringhe, così che il 'tasto invio' non crei problemi nei successivi scan.

Ho già provato ma non funziona :(
Non mi pare tu stia capendo quello che fai. Se aggiungi codice preso qua e la senza capirne l'utilizzo, si chiama "cargo-cult" e non e' affatto utile. Ti consiglio di capire ogni singola cosa.

cleanBuffer() fa un conteggio che non usi -> non serve
cleanBuffer() fa unba pulizia che non serve

Poi, puoi fare quanti scanf vuoi, se la lettura viene fatta ogni volta su un array diverso

Codice:
{
       char nome[256];
        char nome1[256];
        char nome2[256];

        scanf("%s", nome);
        scanf("%s", nome1);
        scanf("%s", nome2);

        printf("letto len=%d %s", strlen(nome), nome);
        printf("letto len=%d %s", strlen(nome1), nome1);
        printf("letto len=%d %s", strlen(nome2), nome2);
}

Per il colore, il passaggio del parametro come ti ho indicato funziona di certo, tracciati con un po' di "printf" dentro la funzione e vedi di capire dov'e' l'errore.'
 
Ultima modifica da un moderatore:

Entra

oppure Accedi utilizzando

Hot: PS5 VS XBOX X/S?

  • Playstation 5

    Voti: 456 63.3%
  • XBOX Series X/S

    Voti: 264 36.7%

Discussioni Simili