Aiuto con funzioni isalpha e fgets [RISOLTO]

di il
4 risposte

Aiuto con funzioni isalpha e fgets [RISOLTO]

Ciao a tutti! Mi sto esercitando per superare l'esame di fondamenti di informatica e mi sono bloccato su un esercizio proposto dal libro:
"Scrivere un programma che, letto da tastiera un singolo carattere, verifichi se è un carattere alfabetico (si può utilizzare la funzione isalpha dichiarata in ctype.h). In caso lo sia, stampi a video se questo è maiuscolo o minuscolo, altrimenti segnali errore. Sfruttare le funzioni di libreria definite in ctype.h come isupper e islower."

Il codice che ho scritto è questo, ma qualunque carattere io scriva da tastiera, mi stampa a video il messaggio di errore. Ho provato a togliere la parte di codice che prevede l'inserimento da tastiera con una semplice definizione della variabile "c" come carattere e funziona normalmente, quindi credo che il problema stia nella fgets (quell'atoi non mi convince in effetti). Sapete aiutarmi? Ve ne sarei molto grato
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main() {
	
	char buf[80];
	int c;
	
	fgets(buf, sizeof(buf), stdin);
	c = atoi(buf);
	
	if( isalpha(c) ) {
		if( islower(c) ) {
			printf("%c e' un carattere minuscolo\n", c);
			}
		if( isupper(c) ) {
			printf("%c e' un carattere maiuscolo\n", c);
		}
	} else {
		printf("Errore: carattere inserito non valido\n");
		}
	return 0;
}

4 Risposte

  • Re: Aiuto con funzioni isalpha e fgets [RISOLTO]

    Credo che tu stai sbagliando nella parte fgets...
    fgets legge da uno stream, vale a dire che legge una riga
    (sottolineo una riga) da un file per esempio un file *.txt.
    Devi sostituire fgets con gets.
    Il tuo programma dovrebbe essere cosi:
    .Leggo un carattere da tastiera (scanf %d)
    .Controllo che sia una lettera (isaplha)
    Per quanto riguarda isupper, islower, questi metodi o funzioni,
    come tu preferisci chiamarli, rispettivamente controllano se è:
    .una lettera maiuscola
    .una lettera minuscola
    Di conseguenza, se il risultato è vero, la funzione ritornera un valore da zero
    viceversa sarà 0.
    Per quanto ho detto di isupper e islower, prendi con le pinze quello che ho detto, perchè non ricordo bene cosa fanno, se per esempio verificano se una lettera e maiuscola/minuscolo, oppure
    convertono la lettera scritta in maiuscolo/minuscolo, dovresti provare, ma l'importante è questo che usi gets e non fgets che fa la stessa cosa, ma legge da un file. La f di fgets sta per file.
    TU NON LEGGI DA FILE MA DA TASTIERA QUINDI funzione gets..
    La funzione atoi trasmora un numero letto come char in un int, poi sizeof ti dice quanto è la tua variabile in bit, cioè è roba che non ti seve a nulla.
    Il testo è escplicito usa isalpha, islower e isupper.
    Ciao!!
  • Re: Aiuto con funzioni isalpha e fgets [RISOLTO]

    Premesso che fgets funziona anche con input da tastiera (stdin = STanarD INput = tastiera), infatti eseguendo il programma mi viene chiesta l'immissione di un carattere da tastiera, tutto il resto del programma funziona. Il problema è proprio nel modo in cui la fgets passa il carattere al resto del programma. La scanf in teoria non dovrebbe servire perché è un argomento non ancora affrontato dal libro. Con scanf in effetti funziona (ti ringrazio ), ma dovrebbe esserci un modo per far funzionare il programma anche con fgets. Qui il codice funzionante con scanf:
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    
    int main() {
    	
    	char c;
    	
    	scanf("%c", &c);
    	
    	if( isalpha(c) ) {
    		if( islower(c) ) {
    			printf("%c e' un carattere minuscolo\n", c);
    			}
    		if( isupper(c) ) {
    			printf("%c e' un carattere maiuscolo\n", c);
    		}
    	} else {
    		printf("Errore: carattere inserito non valido\n");
    		}
    	return 0;
    }
  • Re: Aiuto con funzioni isalpha e fgets [RISOLTO]

    A cosa servirebbe atoi(buf)?
    devi leggere un carattere allora si dovrebbe usare la getchar ma va benissimo anche la fgets:
    
    int main()
    {
       char buf[80];
       
       fgets(buf, sizeof(buf), stdin);
       
       if( isalpha(buf[0]) ) 
       {
          if( islower(buf[0]) ) 
          {
             printf("%c e' un carattere minuscolo\n", buf[0]);
          }
          else if( isupper(buf[0]) ) 
          {
             printf("%c e' un carattere maiuscolo\n", buf[0]);
          }
       } 
       else 
       {
          printf("Errore: carattere inserito non valido\n");
       }
       
       return 0;
    }
    
    o in forma ridotta:
    
    int main()
    {
        char buf[80];
       
        fgets(buf, sizeof(buf), stdin);
       
        if( isalpha(buf[0]) ) 
            printf("'%c' e' un carattere %s\n", buf[0], islower(buf[0]) ? "minuscolo" : "maiuscolo");
        else 
            printf("Errore: carattere '%c' inserito non valido\n",buf[0]);
       
       return 0;
    }
    
  • Re: Aiuto con funzioni isalpha e fgets [RISOLTO]

    vbextreme ha scritto:


    a cosa servirebbe atoi(buf)?
    devi leggere un carattere allora si dovrebbe usare la getchar ma va benissimo anche la fgets:
    
    int main()
    {
       char buf[80];
       
       fgets(buf, sizeof(buf), stdin);
       
       if( isalpha(buf[0]) ) 
       {
          if( islower(buf[0]) ) 
          {
             printf("%c e' un carattere minuscolo\n", buf[0]);
          }
          else if( isupper(buf[0]) ) 
          {
             printf("%c e' un carattere maiuscolo\n", buf[0]);
          }
       } 
       else 
       {
          printf("Errore: carattere inserito non valido\n");
       }
       
       return 0;
    }
    
    Grazie mille!!!
Devi accedere o registrarti per scrivere nel forum
4 risposte