PDA

Visualizza la versione completa : [C] Uso di scanf() e input di caratteri inclusi gli spazi


liberlux
21-03-2007, 17:51
#include<stdio.h>
struct tipo{
int num;
char nome[30];
char cognome[30];
int eta;
};

main()
{
typedef struct tipo record;
record rubrica;

FILE *punta;

if((punta=fopen("rubrica.dat", "w"))==NULL)
printf("Il file non può essere creato.\n");
else
{
printf("Inserisci la posizione in cui intendi scrivere\n"
"da 1 a 100 oppure 0 per uscire\n\n");
scanf("%d", &rubrica.num);

while(rubrica.num !=0)
{
printf("Inserisci Nome, Cognome, età: ");
scanf("%s%s%d", &rubrica.nome,&rubrica.cognome,&rubrica.eta);

fwrite(&rubrica, sizeof(record),1,punta);

printf("Inserisci la posizione in cui intendi scrivere\n"
"da 1 a 100 oppure 0 per uscire\n\n");
scanf("%d", &rubrica.num);
}
fclose(punta);
}
}


Domanda 1 - Perchè nello scanf (interno al while) si usa & per assegnare il valore di input aglli array contenuti nella struct? non sono sempre puntatori al loro primo membro?

Domanda 2 - Come faccio a prendere in input anche lo spazio? Mi spiego, l'utente immette un nome del tipo Paolo Antonio, il programma così com'è assegna Paolo a .nome e Antonio a .Cognome.

Grazie anticipate

Xaratroom
21-03-2007, 18:11
Domanda 1 - Perchè nello scanf (interno al while) si usa & per assegnare il valore di input aglli array contenuti nella struct? non sono sempre puntatori al loro primo membro?
Si , l'identificatore del vettore è il puntatore al primo elemento, ma si usa sempre &

Domanda 2 - Come faccio a prendere in input anche lo spazio? Mi spiego, l'utente immette un nome del tipo Paolo Antonio, il programma così com'è assegna Paolo a .nome e Antonio a .Cognome.
scanf ("%[^\n]s", &stringa);
così leggi dino a \n

andbin
21-03-2007, 18:11
Originariamente inviato da liberlux
Domanda 1 - Perchè nello scanf (interno al while) si usa & per assegnare il valore di input aglli array contenuti nella struct? non sono sempre puntatori al loro primo membro?

scanf("%d", &rubrica.num);
in questo caso ci vuole la & perché rubrica.num è un int

scanf("%s%s%d", &rubrica.nome,&rubrica.cognome,&rubrica.eta);
in questo caso, la & è superflua su rubrica.nome e rubrica.cognome perché sono degli array.
All'interno di una espressione, il solo nome di un array denota già il suo indirizzo. Quindi:

scanf("%s%s%d", rubrica.nome, rubrica.cognome, &rubrica.eta);


Originariamente inviato da liberlux
Domanda 2 - Come faccio a prendere in input anche lo spazio? Mi spiego, l'utente immette un nome del tipo Paolo Antonio, il programma così com'è assegna Paolo a .nome e Antonio a .Cognome.Non puoi, non con la scanf. I "whitespace" (tab, spazi, ecc...) vengono saltati, fungono da "separatori".
O usi una fgets() per leggere una intera riga, o usi qualcos'altro.

Xaratroom
21-03-2007, 18:13
Originariamente inviato da andbin
Non puoi, non con la scanf. I "whitespace" (tab, spazi, ecc...) vengono saltati, fungono da "separatori".
O usi una fgets() per leggere una intera riga, o usi qualcos'altro.

scanf ("%[^\n]s", &stringa); :confused:

...

Però fare &vettore non è uguale a vettore
il primo è l'indirizzo del puntatore al primo elemento o sbaglio ?

liberlux
21-03-2007, 18:27
ok, esaustivi, in effetti anche io pensavo che & fosse superfluo affiancato agli array, nonostante questi fossero parte di una struct, approfitto per un altra domanda, ma per creare un file ad accesso casuale, che successivamente dovrà essere letto, bisogna per forza inizializzarlo oppure no?

Xaratroom
21-03-2007, 18:30
No basta aprirlo in wb... Se esiste viene cancellato, se non esiste viene creato

alka
21-03-2007, 23:03
Originariamente inviato da liberlux
[c] due domandine
Usa titoli più significativi, che diano un'idea del contenuto della discussione.

IIAlexII
29-04-2011, 16:39
scusa se ti scrivo adesso...ma ho esattamente il tuo stesso problema! devo usare scanf e ho provato a fare tutto cio che c'è scritto ma non ha funzionato! tu alla fine come hai risolto? perchè la gets risolverebbe tutti i miei problemi ma purtroppo 1) mi viene sconsigliata 2) il prof a cui consegnerò la tesina non ne sarà tanto contento di sta cavolo di gets! HELPPPPPPPP!! èER FAVORE

YuYevon
29-04-2011, 17:26
Ne stai già parlando qui (http://forum.html.it/forum/showthread.php?s=&threadid=1458296). Dovevi per forza uppare una discussione di 4 anni fa?
Comunque se proprio non ti piace la soluzione che ti hanno proposto con la scanf() e la gets() non la puoi usare (giustamente), esiste la benedetta fgets() (http://www.cplusplus.com/reference/clibrary/cstdio/fgets/), simile alla gets() ma generica e senza i suoi problemi di sicurezza.

IIAlexII
29-04-2011, 20:32
Ne stai già parlando qui. Dovevi per forza uppare una discussione di 4 anni fa?
Comunque se proprio non ti piace la soluzione che ti hanno proposto con la scanf() e la gets() non la puoi usare (giustamente), esiste la benedetta fgets(), simile alla gets() ma generica e senza i suoi problemi di sicurezza

Scusami tanto ma nel googlare mi sono imbattuto in questo ragazzo che aveva il mio stesso problema e ho provato a chiederlo direttamente a lui.Qual'è il problema se chiedo in una discussione gia aperta come aveva risolto il problema??? non penso che uppare una discussione di 4 anni fa ti rechi disagio in qualche modo quindi sei libero tranquillamente di non rispondermi se non ti va! il problema non è che le soluzioni non mi piacciono ma bensi non funzionano purtroppo perchè ho provato e riprovato ma non vanno quindi ho provato a chiedere a questo ragazzo! grazie per la fgets() ma non penso che si distacchi molto dalla gets! grazie cmq per l'aiuto!

Loading