Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

fgets()

21 views
Skip to first unread message

NERO23

unread,
May 22, 2013, 2:03:31 PM5/22/13
to
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;
}

NERO23

unread,
May 23, 2013, 7:05:45 AM5/23/13
to

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;

}





enoquick

unread,
May 24, 2013, 9:04:07 AM5/24/13
to
Il 22/05/2013 13:03, NERO23 ha scritto:
> Perchè inserendo un testo di 19 caratteri appare il messaggio che mi
> avverte di aver superato il limite?

Perchè avendo un buffer di 20 caratteri fgets deve immettere \n e \0
alla fine quindi il massimo numero di caratteri che si possono immettere
senza troncamento sono 18+\n


[CUT]

> c = impiegato->nome[strlen(impiegato->nome) - 1];
> if(c != '\n')
> {
> if(c != EOF)
// questa è sempre vera - come fa c ad essere uguale ad EOF ?

NERO23

unread,
May 24, 2013, 1:16:07 PM5/24/13
to

>> c = impiegato->nome[strlen(impiegato->nome) - 1];
>> if(c != '\n')
>> {
>> 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.

enoquick

unread,
May 24, 2013, 1:27:20 PM5/24/13
to
Il 24/05/2013 12:16, NERO23 ha scritto:
>
>>> c = impiegato->nome[strlen(impiegato->nome) - 1];
>>> if(c != '\n')
>>> {
>>> 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.

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


0 new messages