Lapsus...

Tutta l'informatica

Lapsus...

Messaggioda zakplus » mar set 06, 2005 1:40 pm

Ciao ragazzi, problemino semplice semplice ma che non riesco a risolvere: come faccio a leggere un numero prefissato di caratteri da tastiera in C?
Ricordavo una funzione tipo "getnc()" o qualcosa del genere ma non trovo info a proposito, allora ho deciso di farmi una funzione che fa n volte getchar() ma mi da problemi dopo il primo "giro".
Allego il codice e vi spiego meglio:
Codice: Seleziona tutto
  if( strcmp( argv[1], "-i" ) == 0 )
    {
      /* Inserimento interattivo */
      do
   {
     printf( "Cognome ? > " );
     risultato = getnoillegal( cognome, 40 );
   }
      while( risultato == -1 );

/* TAGLIO ... */

int getnoillegal( char *stringa, int n )
{
  int i;
  char ch=0;
   
  for( i=0 ; i<n ; i++ )
    {
      ch = getchar();
      if( ch == EOF )
   return -1;
      if( ch == '\n' )
   {
     stringa[i] = '\0';
     return 0;
   }
     
      /* Controllo caratteri illegali */
      if( ch<48 || ch>122 )
   return -1;
      if( ch>= 58 && ch<=64 )
   return -1;
      if( ch>= 91 && ch<=96 )
   return -1;

      /* Aggiungo il carattere nella stringa */
      stringa[i] = ch;
    }
}

Il ciclo DO...WHILE funziona bene la prima volta ma se immetto caratteri illegali ristampa la scritta "Cognome ? >" ed esce dal ciclo.
Ho provato a debuggare e sembra che nel secondo ciclo getchar restituisca '\n' anche se non premo nessun tasto.

BOH! :mah:
Chi mi aiuta? GRASSIE!!
Godetevi ogni illusione...

www.zakplus.altervista.org
Avatar utente
zakplus

Veterano
 
Messaggi: 297
Iscritto il: ven set 03, 2004 11:43 pm
Località: Livorno

Messaggioda zakplus » mar set 06, 2005 4:01 pm

...ehm...mi rispondo da solo...

Bastava guardare la sezione bugs del man di gets...
si deve usare fgets con stdin come stream.

char *fgets(char *s, int size, FILE *stream);

:scherza: CIAO! :scherza:
Godetevi ogni illusione...

www.zakplus.altervista.org
Avatar utente
zakplus

Veterano
 
Messaggi: 297
Iscritto il: ven set 03, 2004 11:43 pm
Località: Livorno

Messaggioda riko » sab set 10, 2005 1:27 pm

zakplus ha scritto:Bastava guardare la sezione bugs del man di gets...
si deve usare fgets co.n stdin come stream.
char *fgets(char *s, int size, FILE *stream);


Bravo, oppure se sei POSIX e non solo ANSI puoi usare read (che legge tot bytes, ma sapendo che un carattere è un byte...).

Puoi anche usare fread, ovviamente. Ma la tua soluzione è senza dubbio la migliore.
-enrico
fibs = 0 : 1: [ a + b | (a, b) <- zip fibs (tail fibs) ]


Akropolix: Community OFF-TOPIC di IKSnet
http://www.akropolix.net/forum

"se do da mangiare a un affamato mi dicono che sono un santo, se mi chiedo perch? ? affamato mi dicono che sono un comunista" (Helder C?mara, Arcivescovo di Recife)
Avatar utente
riko

Supremo
 
Messaggi: 3329
Iscritto il: gio mar 04, 2004 4:28 pm
Località: Chiba City

Messaggioda zakplus » ven set 16, 2005 7:31 pm

riko ha scritto:Puoi anche usare fread, ovviamente. Ma la tua soluzione è senza dubbio la migliore.


Grazie :ride: devo ricordarmi che "everything is a file" :annu:
Godetevi ogni illusione...

www.zakplus.altervista.org
Avatar utente
zakplus

Veterano
 
Messaggi: 297
Iscritto il: ven set 03, 2004 11:43 pm
Località: Livorno


Torna a Tecnologia, internet, coding

Chi c’è in linea

Visitano il forum: Majestic-12 [Bot] e 8 ospiti