Novellino in crisi Scanf e Lunghezza Input

di il
4 risposte

Novellino in crisi Scanf e Lunghezza Input

Mi è stato dato il seguente esercizio da svolgere

Scrivere un programma C che, preso in ingresso un carattere, indichi il suo tipo (lettera maiuscola, lettera minuscola, vocale, consonante, numero, …) , il codice ASCII corrispondente e la trasformi in maiuscola se minuscola o viceversa. Inserire nel codice il controllo sull’input dell’utente.

Io l'ho risolto nel seguente modo (funzionante);

#include <stdio.h>
#include <stdlib.h>

int main (void)
{

int C ;

// Ho deciso di lavorare con i codici Ascii e quindi considerare C un int
//per comodità visto che mi permettono con un escamotages di calcolo
//di cambiare le lettere da maiuscole a minuscole
// unico neo, non sono riuscito a discriminare in ingresso stringhe superiori ad un carattere,
//o meglio, il programma agisce sul primo carattere digitato, ignorando i successivi
// tuttavia avrei preferito che ad immissione di più caratteri il programma restituisse errore.

printf ("digita un solo carattere \n");
scanf ("%1c", &C);
if ( C>=48 && C <=57 )
printf ("E\' un numero ");
else if ( C >= 97 && C <= 122 && (C == 97 || C == 101 || C== 105 || C == 111 || C== 117))
printf ("E\' una vocale minuscola la lettera corrispondente maiuscola e\' %c \n", C-32);
else if (C >= 97 && C <= 122 && (C != 97, 101, 105, 111, 117))
printf ("E\' una consonante minuscola e la lettera corrispondente maiuscola e\' %c \n", C-32);
else if ( C>=65 && C <=90 && (C == 65 || C == 69 || C== 73 || C == 79 || C== 85))
printf ("E\' una vocale maiuscola e la lettera minuscola corrispondente e\' %c \n", C+32);
else if (C>=65 && C <=90 && (C != 65, 69, 73, 79, 85)) //discrimino le conosnanti maiuscole
printf ("E\' una consonante maiuscola e la lettera minuscola corrispondente e\' %c \n", (char)C+32);
if ( C >= 0 && C <= 255 )
printf ("Il codice Ascii del carattere digitato e\' %d \n", C);

return 0;

La domanda è la seguente:
Posso io, in qualsiasi modo, limitare la lunghezza dell'input in ingresso.
e, se non posso, come credo,
In che modo posso segnalare un valore in ingresso errato (ovvero superiore ad un singolo carattere digitato) ?
Es. con il programma scritto sopra se digito a mi da come risultati A e il codice asci di 97
ma se scrivo ab, mi restituisce gli stessi valori
io vorrei che in caso di scritto ab (o 1r o 34 o TTTTTT insomma in caso venga immesso più di un carattere) il programma mi segnali errore e non prosegua più.. come posso fare? tenete conto che posso utilizzare solo C e non librerie particolarmente esotiche.
Grazie
affranto -.-

4 Risposte

  • Re: Novellino in crisi Scanf e Lunghezza Input

    Leggi la parte del libro dove parla dell header ctype.h
    Per segnalare l errore basta che dopo l input esegui una strlen e verifichi la sua lunghezza.
    In questo caso particolare puoi verificare se l indice 1 corrisponde a \n o \0 in caso contrario hai troppi caratteri ed esci
  • Re: Novellino in crisi Scanf e Lunghezza Input

    Grazie mille per la celere risposta, ho fatto svariati tentativi in precedenza con la funzione strlen ma evidentemente non al so applicare a dovere, credo che chiederò chiarimenti al professore a questo punto
  • Re: Novellino in crisi Scanf e Lunghezza Input

    Per l'input usa la funzione

    fgets

    e un vettore di char di 1000 elementi.

    Controlla la lunghezza in input e se è maggiore di 1 mostra un errore.
  • Re: Novellino in crisi Scanf e Lunghezza Input

    La ctype.h semplifica il tuo codice, leggila e implementale.
    Leggi una riga di input con fgets e se non l'hai studiata semplicemente con una scanf ma su un vettore di caratteri:
    
    char inp[1000];
    scanf("%s",inp);
    
    allorche io ti consiglio questo:
    
    if ( inp[1] != '\n'  && inp[1] != '\0' ) 
    {
        puts("!!!ATTENZIONE ACCETTO SOLO UN CARATTERE!!!");
        return 0;
    }
    
Devi accedere o registrarti per scrivere nel forum
4 risposte