Newsgroup: it.comp.lang.c
Titolo: fgets()

Perchï¿œ inserendo un testo di  19 caratteri appare il messaggio che mi 
avverte di aver superato il limite?
 
In una precedente discussione mi ï¿œ stato dato una dritta...ma ora mi 
sono arroccato!!
 
 
 
 
 
 
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
int main(void)
{
     typedef struct
     {
         char nome[20];
         char cognome[20];
     } dati;
 
     dati *impiegato;
     int c = 0;
 
     impiegato = malloc(sizeof(dati));
     if (!impiegato)
         {
             fprintf(stderr, "Errore: impossibile allocare %zu "
                     "bytes.\nAlla prossima..\n", sizeof(dati));
             system("PAUSE"); // tanto lo so che sei su Windows
             exit(EXIT_FAILURE);
         }
 
     printf("Nome [max 19 caratteri]: ");
     fgets(impiegato->nome, 20, stdin);
 
     c = impiegato->nome[strlen(impiegato->nome) - 1];
     if(c != '\n')
         {
             if(c != EOF)
                 {
                     puts("Errore nel nome: sei andato oltre i 19 
caratteri");
                     while((c = getchar()) != '\n');
                 }
         }
     else
         {
             impiegato->nome[strlen(impiegato->nome) - 1] = 0;
         }
 
     printf("Cognome [max 19 caratteri]:");
     fgets(impiegato->cognome, 20, stdin);
 
     c = impiegato->cognome[strlen(impiegato->cognome) - 1];
     if(c != '\n')
         {
             if(c != EOF)
                 {
                     puts("Errore nel cognome: sei andato oltre i 19 
caratteri");
                     while((c = getchar()) != '\n');
                 }
         }
     else
         {
             impiegato->cognome[strlen(impiegato->cognome) - 1] = 0;
         }
 
     putchar('\n');
     printf("Nome: %s\n", impiegato->nome);
     printf("Cognome: %s\n", impiegato->cognome);
     free(impiegato);
     return 0;
}

 
Ho risolto cosi e sembra funzionare bene.
Ciao
 
 
 
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define nLMAX 10 // numero max di caratteri+2 per il nome (nLMAX 10 = 
massimo 8 caratteri)
#define cLMAX 10 // numero max di caratteri+2 per il cognome (cLMAX 10 = 
massimo 8 caratteri)
 
 
 
int main(void)
 
{
 
     typedef struct
 
     {
 
         char nome[nLMAX];
 
         char cognome[cLMAX];
 
     } dati;
 
 
 
     dati *impiegato;
 
     int c = 0;
 
 
 
     impiegato = malloc(sizeof(dati));
 
 
 
 
 
     printf("Nome [max %d caratteri: ", nLMAX-2);
 
     fgets(impiegato->nome, nLMAX, stdin);
 
 
 
     c = impiegato->nome[strlen(impiegato->nome) - 1];
 
     if(c != '\n')
 
         {
 
             if(c != EOF)
 
                 {
 
 
 
                     if (strlen(impiegato->nome)> nLMAX-2)
 
                         {
 
                             impiegato->nome[strlen(impiegato->nome) - 
1] = 0;
 
                             printf("Errore nel nome: sei andato oltre i 
%d caratteri\n",nLMAX-2);
 
                         }
 
                     while((c = getchar()) != '\n');
 
                 }
 
         }
 
     else
 
         {
 
             impiegato->nome[strlen(impiegato->nome) - 1] = 0;
 
         }
 
 
 
     printf("Nome [max %d caratteri: ", cLMAX-2);
 
     fgets(impiegato->cognome, cLMAX , stdin);
 
 
 
     c = impiegato->cognome[strlen(impiegato->cognome) - 1];
 
     if(c != '\n')
 
         {
 
             if(c != EOF)
 
                 {
 
 
 
                     if (strlen(impiegato->cognome)> cLMAX-2)
 
                         {
 
 
impiegato->cognome[strlen(impiegato->cognome) - 1] = 0;
 
                             printf("Errore nel cognome: sei andato 
oltre i %d caratteri\n" , cLMAX-2);
 
                         }
 
                     while((c = getchar()) != '\n');
 
                 }
 
         }
 
     else
 
         {
 
             impiegato->cognome[strlen(impiegato->cognome) - 1] = 0;
 
         }
 
 
 
 
 


              if(c != EOF)
			// questa è sempre vera - come fa c ad essere uguale ad EOF ?
 


 
Mi ï¿œ stato consigliato in una precedente discussione (oggetto: fgets() )
dova sei intervenuto anche tu.

 dova sei intervenuto anche tu.
 
Al di là del consiglio di chi sia non so, ma non è importante,
come fa un char ad avere valore -1 su un int ?
La costante EOF è normalmente un int non un char con appunto valore -1 o 
0xFFFFFFFF in esadecimale
E l' espressione  impiegato->nome[strlen(impiegato->nome) - 1] ritorna 
un char non un int
Inoltre EOF è da usare solo come simbolo nelle letture da stream per 
verificare,appunto, l' avvenuto end of file
Negli altri casi non ha molto senso anche perchè il suo valore non è 
detto che sia -1