PDA

Visualizza versione completa : STRUCT C e problema '\n'...


NS-1
03-09-2004, 12.09.53
#include <stdio.h>
#include <stdlib.h>

typedef struct{
int anni;
char nome[64];
}persona;

main(){

persona primo;
persona *ptrPrimo;


ptrPrimo = &primo;

printf("Inserisci il nome: ");
fgets(primo.nome, 60, stdin);

printf("Inserisci anni: ");
scanf("%d", &primo.anni);

printf("\n\nNome: %s - Anni: %d\n\n", primo.nome, primo.anni );

printf("Nome: %s - Anni: %d\n\n", ptrPrimo->nome , ptrPrimo->anni );

printf("Nome: %s - Anni: %d\n\n", (*ptrPrimo).nome, (*ptrPrimo).anni );

system("PAUSE");
return 0;
}


non capisco perchè nelle istruzioni finali di printf mi esegue un '\n' che non c'è... cosa sbaglio?

grazie

NS-1
03-09-2004, 12.17.04
ho visto che il problema sta nella dichiarazione della variabile char all'interno della struct...


non sapendo quanto sarà lungo il nome inserito, cosa devo fare per stampare solo i caratteri fino al '\0'? c'è qualche funzione che può aiutarmi oppure la devo fare a mano?


grazie...

:D

LoryOne
03-09-2004, 18.49.09
Lanciando il programma così com'è ho riscontrato queste due anomalie:
- Se effettuo l'input di lunghezza <60 il programma non crasha e gli anni li scrive una riga sotto
- Se effettuo l'input di lunghezza >=60 il programma non crasha e gli anni vengono scritti sulla stessa riga, come è giusto che sia.

Risponderò al tuo quesito con due domande:
Sapresti spiegare perchè ?
Come si comporta fgets() o meglio, cosa restituisce ?

Nb: Conosci l'importanza delle safe strings in C ?

LoryOne
03-09-2004, 19.01.38
ho visto che il problema sta nella dichiarazione della variabile char all'interno della struct...


Il C è da buttare allora ! :D

unomichisiada
04-09-2004, 13.41.17
La fgets (e anche la gets che è una fgets su stdin) se lo legge (cioè se prima non arriva al limite massimo di caratteri da leggere specificato nel'argomento) inserisce il carattere '\n' nella stringa letta perciò per risolvere il tuo problema è sufficiente sostituire tale carattere con un terminatore di stringa '\0' come ho fatto io nelle due istruzioni delimitate ai commenti.Ciao

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

typedef struct{
int anni;
char nome[64];
}persona;

main(){

persona primo;
persona *ptrPrimo;
int len;

ptrPrimo = &primo;

printf("Inserisci il nome: ");
fgets(primo.nome, 60, stdin);
//-----------------------
len = strlen(primo.nome);
primo.nome[len-1] = '\0';
//-----------------------
printf("Inserisci anni: ");
scanf("%d", &primo.anni);

printf("\n\nNome: %s - Anni: %d\n\n", primo.nome, primo.anni );

printf("Nome: %s - Anni: %d\n\n", ptrPrimo->nome , ptrPrimo->anni );

printf("Nome: %s - Anni: %d\n\n", (*ptrPrimo).nome, (*ptrPrimo).anni );

system("PAUSE");
return 0;
}

LoryOne
04-09-2004, 18.22.48
len = strlen(primo.nome);
primo.nome[len-1] = '\0';


(Y)
Speriamo che NS-1 abbia risolto. :)

unomichisiada
04-09-2004, 19.51.43
Beh il problema che denuncia lui queste due istruzioni lo risolvono...quindi se io ho compreso bene la sua domanda dovrebbe andar bene,le cose cambiano se io ho capito male...

NS-1
06-09-2004, 08.16.33
:eek: ma si può essere così...... lasciamo perdere....

grazie mille per l'aiuto....

ma secondo voi perchè aggiunge '\n'? non mi sembra una scelta prorpio intelligente....


grazie ancora... (Y)

LoryOne
06-09-2004, 09.13.30
Probabilmente perchè fgets() è più usato per leggere stringhe di testo da un file, non per effettuare l'input da tastiera.

NS-1
06-09-2004, 11.02.05
:p scusa... e grazie per l'info...

LoryOne
06-09-2004, 11.10.37
Scusa de che ?
La prossima volta non esci più per una settimana, chiaro ? :devil: :devil:

NS-1
06-09-2004, 11.35.16
:D:D:D:D:D:D:D