Informatica
Mi serve una mano con questo codice che sto imparando per conto mio. in pratica voglio andare a creare un file con nomi di canzoni che piano piano aggiungo io.
questo e' il codice:
#include
#include
#include
#define lung 26 //lunghezza parole per nomi canzoni
main ()
{
char nomeCanzone[lung + 1];
int numCanzoni;//variabile per il numero di canzoni che voglio aggiungere
int i;
FILE *fp;
fp = fopen("Musica.txt", "a");//apro il file
printf("quante canzoni vuoi inserire?\n");
scanf("%d",&numCanzoni);
for(i=0;i
{
printf("nome canzone: ");
gets(nomeCanzone);//uso gets perche mi permette di usare gli spazi
fputs(nomeCanzone,fp);//porto la stringa che ho scritto prima nel file
}
fclose(fp);//chiudo il file
system("PAUSE");
}
Il problema e' che quando vado a inserire il numero delle canzoni (per esempio 2), sullo schermo appare
quante canzoni vuoi inserire?
(inserisco 2)
nome canzone: nome canzone:
in pratica mi salta la prima facendomi inserire sempre una canzone in meno...
non capisco dove sta il problema.
vi ringrazio in anticipo <3
questo e' il codice:
#include
#include
#include
#define lung 26 //lunghezza parole per nomi canzoni
main ()
{
char nomeCanzone[lung + 1];
int numCanzoni;//variabile per il numero di canzoni che voglio aggiungere
int i;
FILE *fp;
fp = fopen("Musica.txt", "a");//apro il file
printf("quante canzoni vuoi inserire?\n");
scanf("%d",&numCanzoni);
for(i=0;i
printf("nome canzone: ");
gets(nomeCanzone);//uso gets perche mi permette di usare gli spazi
fputs(nomeCanzone,fp);//porto la stringa che ho scritto prima nel file
}
fclose(fp);//chiudo il file
system("PAUSE");
}
Il problema e' che quando vado a inserire il numero delle canzoni (per esempio 2), sullo schermo appare
quante canzoni vuoi inserire?
(inserisco 2)
nome canzone: nome canzone:
in pratica mi salta la prima facendomi inserire sempre una canzone in meno...
non capisco dove sta il problema.
vi ringrazio in anticipo <3
Risposte
Sposto in Informatica
Il problema è che [tt]scanf[/tt] legge il numero e poi lascia il resto della riga nello stream di input. [tt]gets[/tt] (ma sarebbe meglio usare [tt]fgets[/tt] essendo la funzione che hai usato rimossa dallo standard C più recente per un sacco di buone ragioni) legge fino a trovare un "a capo" nello stream di input e in questo caso incontra immediatamente quello della prima riga di input dove hai inserito il numero. Questa è una delle ragioni per cui è di solito buona norma non mischiare lo [tt]scanf[/tt] con [tt]gets/fgets[/tt].
Esistono principalmente due alternative:
1. Rimuovere il primo carattere di a capo con [tt]gets/fgets/getchar/..[/tt] subito dopo la lettura con [tt]scanf[/tt].
2. Leggere la riga dello [tt]scanf[/tt] usando un [tt]fgets[/tt] seguito dall'uso di [tt]atoi[/tt] o [tt]sscanf[/tt].
Esistono principalmente due alternative:
1. Rimuovere il primo carattere di a capo con [tt]gets/fgets/getchar/..[/tt] subito dopo la lettura con [tt]scanf[/tt].
2. Leggere la riga dello [tt]scanf[/tt] usando un [tt]fgets[/tt] seguito dall'uso di [tt]atoi[/tt] o [tt]sscanf[/tt].