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

struct e malloc in C

48 views
Skip to first unread message

NERO23

unread,
May 16, 2013, 3:10:00 PM5/16/13
to
Il codice riportato sotto mi genera un errore. Dove sbaglio?

Dopo aver digitato il nome e il cognome, la console mi stampa solo il
cognome.

Perchᅵ mi salta il nome?

Grazie
nero23



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


int main(void)
{
typedef struct dati
{
char nome[20];
char cognome[20];
} dati;
dati *impiegato;

impiegato = ( dati *) malloc(sizeof( dati)); //alloco la memoria


printf("Nome [0 per uscire]: ");
scanf("%s",impiegato->nome);


fflush(stdin); //Svuoto il buffer

printf("Cognome [0 per uscire]: ");
scanf("%s",impiegato->cognome);


free(impiegato); // Dealloco la memoria


printf("%s\n",impiegato->nome);
printf("%s\n",impiegato->cognome);


return 0;
}

Vincenzo Mercuri

unread,
May 16, 2013, 4:18:42 PM5/16/13
to
Il 16/05/2013 21:10, NERO23 ha scritto:
> Il codice riportato sotto mi genera un errore. Dove sbaglio?
>
> Dopo aver digitato il nome e il cognome, la console mi stampa solo il
> cognome.
>
> Perchᅵ mi salta il nome?
>
> Grazie
> nero23
>
>
>
> #include <stdlib.h>
> #include <stdio.h>
>
>
> int main(void)
> {
> typedef struct dati
> {
> char nome[20];
> char cognome[20];
> } dati;
> dati *impiegato;

Non c'ᅵ bisogno del tag "dati", basta scrivere:

typedef struct { char nome[20]; char cognome[20]; } dati;

[..]
> free(impiegato); // Dealloco la memoria
>
>
> printf("%s\n",impiegato->nome);
> printf("%s\n",impiegato->cognome);
[..]

Bravo, libera la memoria e dopo usala, mi raccomando ;)
Caro NERO23, personalmente apprezzo molto il tuo sforzo di tenere in vita
questo newsgroup, a me pare evidente che il tuo ᅵ un "trollismo bonario",
chiamiamolo cosᅵ. Certo farebbe molto piᅵ piacere una partecipazione piᅵ
attiva, piᅵ fruttuosa e costruttiva, di piᅵ teste, che non la semplice
presentazione di problemi "ad hoc". Ciao!


--
Vincenzo Mercuri

NERO23

unread,
May 17, 2013, 1:05:01 PM5/17/13
to
Che svista :(
Grazie, ora funziona

ciao

Manlio Perillo

unread,
May 17, 2013, 1:16:08 PM5/17/13
to
Il Thu, 16 May 2013 21:10:00 +0200, NERO23 ha scritto:

> [...]
> #include <stdlib.h>
> #include <stdio.h>
>
>
> int main(void)
> {
> typedef struct dati
> {
> char nome[20];
> char cognome[20];
> } dati;
> dati *impiegato;
>
> impiegato = ( dati *) malloc(sizeof( dati)); //alloco la memoria
>
>
> printf("Nome [0 per uscire]: ");
> scanf("%s",impiegato->nome);
>

A parte l'errore che ti hanno già segnalato, fai attenzione quando leggi
una stringa senza controllo sulle dimensioni (anzi, non leggere *mai* una
stringa senza controllo). Che succede se l'utente, da terminale,
inserisce più di 20 caratteri?


> [...]


Ciao Manlio

NERO23

unread,
May 17, 2013, 1:36:57 PM5/17/13
to

> A parte l'errore che ti hanno giᅵ segnalato, fai attenzione quando leggi
> una stringa senza controllo sulle dimensioni (anzi, non leggere *mai* una
> stringa senza controllo). Che succede se l'utente, da terminale,
> inserisce più di 20 caratteri?


non sono 19 + \0 caratteri?

Vincenzo Mercuri

unread,
May 17, 2013, 2:22:34 PM5/17/13
to
Si, con il tuo programma se inserisci oltre 19 caratteri da tastiera fai
crashare il mondo. L'argomento era giᅵ stato affrontato, puoi uscirne o
usando una funzione tipo 'getline()', come ti avevo detto, oppure utilizzi
una funzione come 'fgets()' con qualche accortezza..


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

int main(void)
{
typedef struct
{
char nome[20];
char cognome[20];
} dati;

dati *impiegato;
int c = 0;

impiegato = malloc(sizeof(dati));

printf("Nome [0 per uscire]: ");
fgets(impiegato->nome, 20, stdin);

while((c = getchar()) != '\n');
printf("Cognome [0 per uscire]: ");
fgets(impiegato->cognome, 20, stdin);

printf("%s\n", impiegato->nome);
printf("%s\n", impiegato->cognome);
free(impiegato);
return 0;
}

NB: la riga

while((c = getchar()) != '\n');

ti permette di non includere nella stringa successiva (cioᅵ
'impiegato->cognome') i caratteri che non possono rientrare nella
stringa 'impiegato->nome'.. almeno cosᅵ il programma non crasha mai..

PS: una svista da parte mia, 'fflush(stdin)' ᅵ assolutamente vietato,
porta ad undefined behavior.. 'fflush()' serve solo per gli stream
in output.

--
Vincenzo Mercuri

NERO23

unread,
May 17, 2013, 2:23:47 PM5/17/13
to

> A parte l'errore che ti hanno giᅵ segnalato, fai attenzione quando leggi
> una stringa senza controllo sulle dimensioni (anzi, non leggere *mai* una
> stringa senza controllo). Che succede se l'utente, da terminale,
> inserisce più di 20 caratteri?

ho risolto con la funzione fgets() (almeno credo....)


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


int main(void)
{

typedef struct
{
char nome[20];
char cognome[20];
} dati;

dati *impiegato;

impiegato = ( dati *) malloc(sizeof( dati));

printf("Nome [max 19 caratteri]: ");
fgets( impiegato->nome, 20, stdin );

fflush(stdin); //Svuoto il buffer

printf("Cognome [max 19 caratteri]: ");
fgets( impiegato->cognome, 20, stdin );



printf("%s\n",impiegato->nome);
printf("%s\n",impiegato->cognome);


free(impiegato);

return 0;
}

Vincenzo Mercuri

unread,
May 17, 2013, 2:28:48 PM5/17/13
to
Il 17/05/2013 20:23, NERO23 ha scritto:

>
> ho risolto con la funzione fgets() (almeno credo....)
>

vedi la mia risposta appena sopra

[..]
> printf("Nome [max 19 caratteri]: ");
> fgets( impiegato->nome, 20, stdin );
>
> fflush(stdin); //Svuoto il buffer

questa chiamata a flush() provoca UB, anche se il programma compila

>
> printf("Cognome [max 19 caratteri]: ");
> fgets( impiegato->cognome, 20, stdin );
>


due 'fgets()' successive devono essere gestite con attenzione, se vai
oltre 19 caratteri comunque ti trovi nei pasticci, provare per credere : )

--
Vincenzo Mercuri

Vincenzo Mercuri

unread,
May 17, 2013, 2:37:01 PM5/17/13
to
Il 17/05/2013 20:22, Vincenzo Mercuri ha scritto:
[..]
> ti permette di non includere nella stringa successiva (cioᅵ
> 'impiegato->cognome') i caratteri che non possono rientrare nella
> stringa 'impiegato->nome'.. almeno cosᅵ il programma non crasha mai..
>

Rettifica: con le 'fgets()' il programma non crasherebbe, ma rimarrebbero
nel buffer in input dei caratteri non letti, compreso il carattere '\n'
che verrebbe letto automaticamente alla chiamata successiva di 'fgets()'
che quindi non ti permetterebbe piᅵ di inserire altro.


--
Vincenzo Mercuri

NERO23

unread,
May 17, 2013, 2:42:03 PM5/17/13
to

> while((c = getchar()) != '\n');
>


Dopo aver inserito il nome, sono costretto a dare due volte l'invio.
Non succede se elimino l'istruzione while((c = getchar()) != '\n');

Manlio Perillo

unread,
May 17, 2013, 2:43:51 PM5/17/13
to
Il Fri, 17 May 2013 20:22:34 +0200, Vincenzo Mercuri ha scritto:

> Il 17/05/2013 19:36, NERO23 ha scritto:
>>
>>> A parte l'errore che ti hanno già segnalato, fai attenzione quando
>>> leggi una stringa senza controllo sulle dimensioni (anzi, non leggere
>>> *mai* una stringa senza controllo). Che succede se l'utente, da
>>> terminale, inserisce più di 20 caratteri?
>>
>>
>> non sono 19 + \0 caratteri?
>
> Si, con il tuo programma se inserisci oltre 19 caratteri da tastiera fai
> crashare il mondo. L'argomento era già stato affrontato, puoi uscirne o
> usando una funzione tipo 'getline()', come ti avevo detto, oppure
> utilizzi una funzione come 'fgets()' con qualche accortezza..
>

Oppure un semplice:

scanf("%19s",impiegato->nome);

Peccato che non sia possibile fare

scanf("%*s", 19, impiegato->nome);

cosa che rende la specificazione del numero massimo di caratteri da
leggere abbastanza scomoda.


Ciao Manlio

Manlio Perillo

unread,
May 17, 2013, 3:03:52 PM5/17/13
to
Il Fri, 17 May 2013 20:37:01 +0200, Vincenzo Mercuri ha scritto:

> [...]
> Rettifica: con le 'fgets()' il programma non crasherebbe, ma
> rimarrebbero nel buffer in input dei caratteri non letti, compreso il
> carattere '\n' che verrebbe letto automaticamente alla chiamata
> successiva di 'fgets()' che quindi non ti permetterebbe più di inserire
> altro.

Direi che questo comportamento è implementation defined.
Succede leggendo da terminale, a meno di non modificarne il comportamento.


Ciao Manlio

Vincenzo Mercuri

unread,
May 17, 2013, 3:10:46 PM5/17/13
to
Ops, si avevo dimenticato che 'fgets()' quando puo' inserisce il carattere
'\n' all'interno dell'array. Ora, se elimini la riga 'while..' incorri
comunque nel problema che oltre 19 caratteri non puoi andare. Allora il
test si complica un pochino, ma niente di che:

#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));

printf("Nome [0 per uscire]: ");
fgets(impiegato->nome, 20, stdin);

if(impiegato->nome[strlen(impiegato->nome) - 1] != '\n')
while((c = getchar()) != '\n');

printf("Cognome [0 per uscire]: ");
fgets(impiegato->cognome, 20, stdin);

printf("%s\n", impiegato->nome);
printf("%s\n", impiegato->cognome);
free(impiegato);
return 0;
}

Se ci fai caso, per stringhe piccole di caratteri, cioᅵ che non tocchino
la dimensione 19, 'fgets()' inserisce automaticamente '\n' e te ne accorgi
quando le stampi con 'printf()'.. naturalmente puoi sempre togliere '\n'
dalla stringa, questo perᅵ lo lascio a te, ᅵ facile : )
--
Vincenzo Mercuri

Vincenzo Mercuri

unread,
May 17, 2013, 3:16:46 PM5/17/13
to
Lo Standard a proposito della funzione 'int fflush(FILE* stream)' dice
questo (N1256, 7.19.5.2p2):

If stream points to an output stream or an update stream in which
the most recent operation was not input, the fflush function causes
any unwritten data for that stream to be delivered to the host
environment to be written to the file; otherwise, the behavior is
undefined.

con 'stdin' siamo nel caso "otherwise", quindi UB.

PS: non so dirti se nel C11 sia cambiato qualcosa.

--
Vincenzo Mercuri

Vincenzo Mercuri

unread,
May 17, 2013, 3:19:56 PM5/17/13
to
.. Scusa Manlio, non ti riferivi a fflush(), devo aver dormito
poco stanotte : ) si sono d'accordo con te.

--
Vincenzo Mercuri

enoquick

unread,
May 17, 2013, 3:27:06 PM5/17/13
to
Mi sembra che fgets,quella standard, legga al massimo n -1 caratteri, e
il puntatore al file è quello relativo all' ultimo carattere letto.
A meno di errori ovviamente, cioè se restituisce null.
Perchè dici che il comportamento è implementation defined ?

NERO23

unread,
May 17, 2013, 4:30:52 PM5/17/13
to


> con 'stdin' siamo nel caso "otherwise", quindi UB.


Ti dispiace spiegarmi cosa si intende per UB?
Con il codice riportato sotto sembra funzionare tutto perfettamente.
Non riesco a spiegarmi perchᅵ tra la stampa del nome e la stampa del
cognome, mi salta una riga
esempio

Mario

Rossi

anzichᅵ

Mario
Rossi








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


int main(void)
{

typedef struct
{
char nome[20];
char cognome[20];
} dati;

dati *impiegato;

impiegato = ( dati *) malloc(sizeof( dati)); //alloco la memoria

printf("Nome [max 19 caratteri]: ");
fgets( impiegato->nome, 20, stdin ); // Accetta solo i primi 19
caratteri

fflush(stdin); //Svuoto il buffer

printf("Cognome [max 19 caratteri]: ");
fgets( impiegato->cognome, 20, stdin ); // Accetta solo i primi 19
caratteri


printf("%s\n",impiegato->nome);
printf("%s\n",impiegato->cognome);


free(impiegato); // Dealloco la memoria

return 0;
}

Vincenzo Mercuri

unread,
May 18, 2013, 3:52:02 AM5/18/13
to
On 17/05/2013 22:30, NERO23 wrote:
>
>
>> con 'stdin' siamo nel caso "otherwise", quindi UB.
>
>
> Ti dispiace spiegarmi cosa si intende per UB?

Undefined Behavior (comportamento indefinito), significa
che non ᅵ piᅵ prevedibile l'output del tuo programma.

> Con il codice riportato sotto sembra funzionare tutto perfettamente.
> Non riesco a spiegarmi perchᅵ tra la stampa del nome e la stampa del
> cognome, mi salta una riga
> esempio
>
> Mario
>
> Rossi
>
> anzichᅵ
>
> Mario
> Rossi

Ti ho spiegato il motivo, ti ho anche dato una versione piᅵ corretta
del codice. Col programma tuo non potresti scrivere per esempio il
nome "Carlo Alberto Giovanni". Gli spazi aggiuntivi che vedi sono
dovuti al fatto che 'fgets()', se trova spazio nell'array di caratteri,
inserisce anche il carattere di newline '\n'.

[..]

> fflush(stdin); //Svuoto il buffer
[..]

Vedo che con te parlare non serve a niente.

--
Vincenzo Mercuri

enoquick

unread,
May 18, 2013, 12:36:40 PM5/18/13
to
Il 18/05/2013 02:52, Vincenzo Mercuri ha scritto:
> On 17/05/2013 22:30, NERO23 wrote:
[CUT]

Col programma tuo non potresti scrivere per esempio il
> nome "Carlo Alberto Giovanni". Gli spazi aggiuntivi che vedi sono
> dovuti al fatto che 'fgets()', se trova spazio nell'array di caratteri,
> inserisce anche il carattere di newline '\n'.
>

Questa è bella, ogni tanto ne sento di tutti i colori :)


Vincenzo Mercuri

unread,
May 18, 2013, 1:16:32 PM5/18/13
to
Eheh, si era un modo suggestivo per farlo capire, ma diamine, quando
uno è proprio interessato alla singola funzione della libreria standard
c'è una documentazione su internet che non finisce più.. : P

--
Vincenzo Mercuri

enoquick

unread,
May 18, 2013, 1:38:49 PM5/18/13
to
Che compilatore usi perchè la fgets inserisca un newline se la riga
contiene spazi ?

NERO23

unread,
May 18, 2013, 1:57:11 PM5/18/13
to

> Che compilatore usi perchÚ la fgets inserisca un newline se la riga
> contiene spazi ?


Anche se il mio codice potrebbe dare i numeri, come piᅵ volte mi ᅵ stato
fatto notare qui, riesco a inserire una stringa tipo "Mario Rossi"

enoquick

unread,
May 18, 2013, 2:00:47 PM5/18/13
to
Il 18/05/2013 12:57, NERO23 ha scritto:
>
>> Che compilatore usi perchÚ la fgets inserisca un newline se la riga
>> contiene spazi ?
>
>
> Anche se il mio codice potrebbe dare i numeri, come più volte mi è stato
> fatto notare qui, riesco a inserire una stringa tipo "Mario Rossi"
>

Che compilatore usi ?

NERO23

unread,
May 18, 2013, 2:08:10 PM5/18/13
to

>
> while((c = getchar()) != '\n');
>


In molti forum usano l'istruzione

while(( getchar()) != '\n');

per svuotare il buffer. Un po' diversa dalla tua.

Vincenzo Mercuri

unread,
May 18, 2013, 2:12:51 PM5/18/13
to
Il 18/05/2013 19:38, enoquick ha scritto:
[..]
>
> Che compilatore usi perchè la fgets inserisca un newline se la riga
> contiene spazi ?
>

Non è questione di compilatore, è proprio il comportamento previsto
dallo Sandard. Una chiamata tipo fgets(stringa, n, stdin) copia in
'stringa' tutti i caratteri che inserisci (spazi compresi) finchè
non succede che: o raggiungi gli n-1 caratteri, o incontra '\n'
oppure EOF. Se ne legge n-1 allora l'unica cosa che puo' fare
è mettere in coda '\0' per chiudere la stringa. Altrimenti
inserisce sia '\n' che '\0'.

--
Vincenzo Mercuri

Vincenzo Mercuri

unread,
May 18, 2013, 2:16:22 PM5/18/13
to
Altrimenti intendevo se incontra prima '\n' inserisce
sia '\n' che '\0'. Se incontra EOF invece termina la lettura
e l'inserimento. Uso gcc 4.8.0 comunque.

--
Vincenzo Mercuri

NERO23

unread,
May 18, 2013, 2:27:20 PM5/18/13
to

> Che compilatore usi ?


codeblocks-12.11mingw

NERO23

unread,
May 18, 2013, 2:31:39 PM5/18/13
to

> Non Ú questione di compilatore, Ú proprio il comportamento previsto
> dallo Sandard. Una chiamata tipo fgets(stringa, n, stdin) copia in
> 'stringa' tutti i caratteri che inserisci (spazi compresi) finchÚ
> non succede che: o raggiungi gli n-1 caratteri, o incontra '\n'
> oppure EOF. Se ne legge n-1 allora l'unica cosa che puo' fare
> Ú mettere in coda '\0' per chiudere la stringa. Altrimenti
> inserisce sia '\n' che '\0'.

Questo giustifica il fatto che tra i due printf aggiunge una riga vuota
quando la stringa inserita (campo nome) ᅵ piᅵ corta di 19 caratteri


Vincenzo Mercuri

unread,
May 18, 2013, 2:53:34 PM5/18/13
to
Certo.

#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("Inserisci il nome: ");
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("Inserisci il cognome: ");
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;
}



--
Vincenzo Mercuri

Vincenzo Mercuri

unread,
May 18, 2013, 2:56:41 PM5/18/13
to
Il 18/05/2013 20:53, Vincenzo Mercuri ha scritto:

[..]
> exit("EXIT_FAILURE");

che senza virgolette ᅵ meglio

--
Vincenzo Mercuri

Vincenzo Mercuri

unread,
May 18, 2013, 3:09:32 PM5/18/13
to
Il 18/05/2013 20:53, Vincenzo Mercuri ha scritto:
Mbeh, sono ancora in attesa del bug, non l'hai ancora trovato?

--
Vincenzo Mercuri

NERO23

unread,
May 18, 2013, 3:12:18 PM5/18/13
to

> putchar('\n');


Qui va anche bene anche il classico printf("\n"); ?

Vincenzo Mercuri

unread,
May 18, 2013, 3:13:28 PM5/18/13
to
Il 18/05/2013 21:12, NERO23 ha scritto:
>
>> putchar('\n');
>
>
> Qui va anche bene anche il classico printf("\n"); ?

No, solo putchar('\n'); va bene, mi dispiace.

--
Vincenzo Mercuri

NERO23

unread,
May 18, 2013, 3:15:06 PM5/18/13
to

> No, solo putchar('\n'); va bene, mi dispiace.


??

enoquick

unread,
May 18, 2013, 3:22:44 PM5/18/13
to
Il 18/05/2013 13:27, NERO23 ha scritto:
>
>> Che compilatore usi ?
>
>
> codeblocks-12.11mingw


Che funziona secondo gli std quindi è giusto cosi (la riga Mario Rossi
funziona)

Vincenzo Mercuri

unread,
May 18, 2013, 3:25:18 PM5/18/13
to
Qui pullula di trolls. Anche il mio trolling-against-trolls
è fallito, vi saluto : )

--
Vincenzo Mercuri

enoquick

unread,
May 18, 2013, 3:26:28 PM5/18/13
to
Quello che dici è il comportamento della fgets std
Ma quindi cosa intendi con la frase che ti riporto sotto ?

Gli spazi aggiuntivi che vedi sono
dovuti al fatto che 'fgets()', se trova spazio nell'array di caratteri,
inserisce anche il carattere di newline '\n'.

Probabilmente sono io che non ho interpretato correttamente la frase

enoquick

unread,
May 18, 2013, 3:29:13 PM5/18/13
to
Prima di darmi del troll perchè non leggi la mia risposta a te in un
altro thread di questo post ?

enoquick

unread,
May 18, 2013, 3:34:33 PM5/18/13
to
> quando la stringa inserita (campo nome) è più corta di 19 caratteri
>
>

Quello è dovuto all' istruzione while((c = getchar()) != '\n')
(che è la stessa cosa di while(getchar() != '\n') in quanto la variabile
'c' non è usata )

NERO23

unread,
May 19, 2013, 1:45:21 AM5/19/13
to

> c = impiegato->nome[strlen(impiegato->nome) - 1];
> if(c != '\n')
> {
> if(c != EOF)
> {


Non mi trovo con questa parte del codice.
Cosi mi dovrebbe segnalare il superamento della lunghezza massima anche
inserendo solo 19 caratteri...

NERO23

unread,
May 19, 2013, 2:24:58 AM5/19/13
to

>> Questo giustifica il fatto che tra i due printf aggiunge una riga vuota
>> quando la stringa inserita (campo nome) Ú più corta di 19 caratteri
>>
>>
>
> Quello Ú dovuto all' istruzione while((c = getchar()) != '\n')
> (che Ú la stessa cosa di while(getchar() != '\n') in quanto la
> variabile 'c' non Ú usata )
>

???

Vincenzo Mercuri

unread,
May 19, 2013, 2:57:11 AM5/19/13
to
Bravo! Hai trovato il bug! Ora meriti una merendina.

--
Vincenzo Mercuri

NERO23

unread,
May 19, 2013, 4:05:26 AM5/19/13
to

>> Non mi trovo con questa parte del codice.
>> Cosi mi dovrebbe segnalare il superamento della lunghezza massima anche
>> inserendo solo 19 caratteri...
>
> Bravo! Hai trovato il bug! Ora meriti una merendina.

Ipotizziamo di aver digitato 19 caratteri. Nel vettore entrano 19
caratteri + \n, ma manca \0.


NERO23

unread,
May 19, 2013, 4:24:28 AM5/19/13
to

> Ipotizziamo di aver digitato 19 caratteri. Nel vettore entrano 19
> caratteri + \n, ma manca \0.


opss...
Digitando 19 caratteri + l'invio, fgets() acquisisce 19 caratteri.
Quindi perde l'\n. Di conseguenza, non mancherᅵ mai \0


NERO23

unread,
May 19, 2013, 4:57:28 AM5/19/13
to
c = impiegato->nome[strlen(impiegato->nome) - 1];

La funzione strlen() conta anche \n, ma non \0

se digito 19 caratteri(e quindi sono nel limite max) o piᅵ, c
corrisponde sempre al carattere della posizione 18 del vettore
nome/cognome. Quindi c non immagazzina il valore \n

enoquick

unread,
May 19, 2013, 9:56:49 AM5/19/13
to
Se inserisci una stringa < 19 chars la while attenderà un input da
stdin, dai l' invio per proseguire e avrai una nuova linea se è questo
che intendevi

NERO23

unread,
May 19, 2013, 3:48:18 PM5/19/13
to

> se digito 19 caratteri(e quindi sono nel limite max) o piᅵ, c
> corrisponde sempre al carattere della posizione 18 del vettore
> nome/cognome. Quindi c non immagazzina il valore \n

intendevo dire impiegato->nome[18] corrisponde al 19 carattere...

NERO23

unread,
May 19, 2013, 5:08:50 PM5/19/13
to

>> Non mi trovo con questa parte del codice.
>> Cosi mi dovrebbe segnalare il superamento della lunghezza massima anche
>> inserendo solo 19 caratteri...
>
> Bravo! Hai trovato il bug! Ora meriti una merendina.


Se limito a 18 il numero massimo di caratteri digitabili, credo di aver
risolto il problema.

Mi confermate?

0 new messages