C - Spazi in una stringa

Ayanokoji1
E rieccomi per una richiesta d'aiuto, ringrazio ancora chi mi ha gia' aiutato e chi mi aiutera'.

Il mio problema: Devo inserire una stringa con un indirizzo e spazi (Esempio: Via Alessando Manzoni) ma purtroppo scanf mi legge solo sino al primo spazio...

Qualche suggerimento? Perche' stavolta non so' proprio dove mettere mano...

Risposte
Sk_Anonymous
Usa la funzione gets.

Ayanokoji1
Trovo solo la fgets che credo sia differente, mica mi puoi indicare dove vedermi la sua sintassi?

Sk_Anonymous
char* gets(char* str)
Si trova nella libreria stdio.h

hamming_burst
"SLeone":
char* gets(char* str)
Si trova nella libreria stdio.h

non è un buon consiglio l'utilizzo di questa funzione, ormai obsoleta e superata.

fgets(buff,len_buff,STDIN) è invece una buona strada da percorrere.

Ayanokoji1
void setfront (dati_ditta intestazione) {
     
     char tempditta[20];
     int tempdenominazione;
     char tempindirizzovia[30];
     char tempnumero[4];
     char temptelefono[10];
     
     printf ("Inserire il nome della Ditta:\n");
     scanf ("%s", &tempditta);
     char* gets(char* tempditta);     
     strcpy (intestazione.ditta, tempditta);
    
     printf ("Inserire la denominazione sociale della Ditta:\n1 - S.p.A.\n2 - S.n.C.\n3 - S.r.L\n");
     scanf ("%d", &tempdenominazione);
     while ((tempdenominazione != 1) && (tempdenominazione != 2) && (tempdenominazione != 3)) {
           printf ("Inserire una denominazione valida:\n");
           scanf ("%d", &tempdenominazione);
           }
     intestazione.denominazione = tempdenominazione;
     
     printf ("Inserire l'indirizzo della Ditta:\n");
     scanf ("%s", &tempindirizzovia);
     char* gets(char* tempindirizzovia);
     strcpy (intestazione.indirizzovia, tempindirizzovia);
     
     printf ("Inserire il numero civico:\n");
     scanf ("%s", &tempnumero);
     char* gets(char* tempnumero);
     strcpy (intestazione.numero, tempnumero);
     
     printf ("Inserire il numero di telefono\n");
     scanf ("%s", &temptelefono);
     char* gets(char* temptelefono);
     strcpy (intestazione.telefono, temptelefono);
     
     pf = fopen("ditta.bin", "wb");
     fwrite (&intestazione, sizeof(dati_ditta), 1, pf);
     fclose (pf);
     

//Termine setfront
}


Ho tirato fuori questo codice, ma sempre stesso problema, se metto uno spazio mi ignora lo scanf successivo...

@Hamming: strada che percorrerei volentieri se mi dai qualche dritta su dove trovare una buona guida la fgets

hamming_burst
"Ayanokoji":


@Hamming: strada che percorrerei volentieri se mi dai qualche dritta su dove trovare una buona guida la fgets

ricordo una discussione in questa sezione che parlava di gets e di varie alternative per l'input da standard_input, inclusa fgets(). Prova a cercare...

EDIT:
qui dovrebbe esserci un po' tutto, vedi i post di apatriarca.

Ayanokoji1
void setfront (dati_ditta intestazione) {
     
     char tempditta[20];
     int tempdenominazione;
     char tempindirizzovia[30];
     char tempnumero[3];
     char temptelefono[10];
     
     printf ("Inserire il nome della Ditta:\n");
     while (getchar() != '\n');
     fgets(tempditta, 20, stdin); 
     while (getchar() != '\n');    
     strcpy (intestazione.ditta, tempditta);
    
     printf ("Inserire la denominazione sociale della Ditta:\n1 - S.p.A.\n2 - S.n.C.\n3 - S.r.L\n");
     scanf ("%d", &tempdenominazione);
     while ((tempdenominazione != 1) && (tempdenominazione != 2) && (tempdenominazione != 3)) {
           printf ("Inserire una denominazione valida:\n");
           scanf ("%d", &tempdenominazione);
           }
     intestazione.denominazione = tempdenominazione;
     
     printf ("Inserire l'indirizzo della Ditta:\n");
     
     fgets(tempindirizzovia, 30, stdin);
     while (getchar() != '\n');
     strcpy (intestazione.indirizzovia, tempindirizzovia);
     
     printf ("Inserire il numero civico:\n");
     
     fgets(tempnumero, 3, stdin);
     while (getchar() != '\n');
     strcpy (intestazione.numero, tempnumero);
     
     printf ("Inserire il numero di telefono\n");
     
     fgets(temptelefono, 10, stdin);
     while (getchar() != '\n');
     strcpy (intestazione.telefono, temptelefono);
     
     pf = fopen("ditta.bin", "wb");
     fwrite (&intestazione, sizeof(dati_ditta), 1, pf);
     fclose (pf);
     

//Termine setfront
}


Fatto un po' di aggiustamenti al codice e viene fuori questo, il problema e' che ora mi accetta e stampa i campi a random, a volte nome della ditta ed indirizzo appaiono, altre volte no...

hamming_burst
cosa sono tutte queste
while (getchar() != '\n');


Mi pare che non ne serva nessuna, prova ad eliminarle tutte.

Ayanokoji1
void setfront (dati_ditta intestazione) {
     
     char tempditta[20];
     int tempdenominazione;
     char tempindirizzovia[30];
     char tempnumero[3];
     char temptelefono[10];
     
     printf ("Inserire il nome della Ditta:\n");
     
     fgets(tempditta, 20, stdin); 
        
     strcpy (intestazione.ditta, tempditta);
    
     printf ("Inserire la denominazione sociale della Ditta:\n1 - S.p.A.\n2 - S.n.C.\n3 - S.r.L\n");
     scanf ("%d", &tempdenominazione);
     while ((tempdenominazione != 1) && (tempdenominazione != 2) && (tempdenominazione != 3)) {
           printf ("Inserire una denominazione valida:\n");
           scanf ("%d", &tempdenominazione);
           }
     intestazione.denominazione = tempdenominazione;
     
     printf ("Inserire l'indirizzo della Ditta:\n");
     
     fgets(tempindirizzovia, 30, stdin);
     
     strcpy (intestazione.indirizzovia, tempindirizzovia);
     
     printf ("Inserire il numero civico:\n");
     
     fgets(tempnumero, 4, stdin);
     
     strcpy (intestazione.numero, tempnumero);
     
     printf ("Inserire il numero di telefono\n");
     
     fgets(temptelefono, 10, stdin);
     
     strcpy (intestazione.telefono, temptelefono);
     
     pf = fopen("ditta.bin", "wb");
     fwrite (&intestazione, sizeof(dati_ditta), 1, pf);
     fclose (pf);
     

//Termine setfront
}


Tolte tutte, adesso quando lancio la funzione mi stampa il printf "Inserire il nome ditta" ma non aspetta che io inserisca il nome e mi chiede direttamente di inserire la denominazione sociale...

hamming_burst
mmm forse fa due write su stdout in sequenza senza fare una read. La motivazione può esser di bufferizzazione da parte dell'OS, riordino da parte del compilatore del codice, ....
penso risolvi facendo un while su fgets se legge correttamente una stringa (NULL in caso contrario)

dobbiamo forzare di leggere prima di stampare, facendo l'attesa attiva (anche se non è il massimo..)
while(fgets(tempditta, 20, stdin)==NULL);
dove ci acciungi un body se vuoi che ti ristampi la scritta di richiesta dati.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.