Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C] Gestione archivio (era: "Programmare in C")

    Buonasera,
    sono agli inizi dello studio di C. Stavo provando a fare un esercizio per la gestione di un archivio e non riesco a risolvere un problema credo piuttosto semplice. Vorrei che l'utente potesse inserire come marca di un'auto una stringa composta da due parole ma non riesco in nessun modo. Copio il codice incriminato:
    codice:
    #include <stdio.h>
    
    struct automobili {
        char marca[25];       
        char modello[25];
    };
    
    int main(){
     printf("\n Inserire i dati della nuova auto\n");
            printf("Marca:");
            fgets(auto_array[pos].marca,25,stdin);
            printf("\nModello:");
            scanf("%s", auto_array[pos].modello);
         }
    Ho provato anche usando la funzione gets e con scanf("%[^n]s", auto_array[pos].marca) ma non sono riuscita in nessun modo. Anzi se lo compilo sul mac con xcode 5.0.2 mi da un errore dicendo che la funzione gets non è sicura, mentre usando Dev c++ non mi segnala nulla ma poi non legge bene la stringa.
    grazie per l'aiuto!

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,562
    gets non ti legge bene la stringa in che senso?
    Ti segnala che non è sicura perché potrebbe leggere più caratteri di quelli che può contenere il tuo array, è preferibile usare fgets...
    Manca un \ e non serve quella s
    codice:
    scanf("%[^\n]", auto_array[pos].marca)
    Ultima modifica di Scara95; 14-12-2013 a 18:11
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Sì ho dimenticato di scrivere un \ ma nel programma lo avevo messo bene. In pratica l'errore consiste nel fatto che non mi permette di inserire correttamente le stringe.
    Ti copio tutto il sorgente così magari è più facile capire l'errore:
    codice:
    #include <stdio.h>
    
    #define MAX 10
    
    struct automobili {
        char marca[25];        
        char modello[25];
        int  unita;
    };
    
    
    struct automobili auto_array[MAX];
    
    int num_auto=0; 
    
    
    int Menu();   
    
    int Inserimento(int);   
    
    void Visualizzazione(int, struct automobili *); 
    
    
    
    
    int main(){
        int scelta=-1;          
        while (scelta!=0) {
            scelta=Menu();
            if (scelta==1){
                num_auto = Inserimento(num_auto);}
            else if(scelta==2) Visualizzazione(num_auto, auto_array);
        }
        printf("\nArrivederci\n");
    }
    
    int Menu(){
        int n;
        do{
            printf("\t-----------------------------------\n");
            printf("\t-------------Archivio--------------\n");
            printf("\t-----------------------------------\n\n");
            printf("\t 1. Inserire una nuova autovettura\n");
            printf("\t 2. Visualizzare archivio\n");
            printf("\t 0. Uscire\n\n");
            printf("\t Cosa vuoi fare?\n \t>>");
            scanf("%d",&n);
        }while (n!=0 && n!=1 && n!=2); 
        return n;
    }
    
    void Visualizzazione(int pos, struct automobili *p){
        int i; //contatore auto
        char pausa;
        if (pos==0) {
            printf("\nIn questo momento non ci sono macchine in garage.\n\n");
            scanf("%c", &pausa);
        }
        else{
            for(i=0; i<pos; i++){
                printf("\n %d° macchina:\n",i+1);
                printf("\tMarca:\t %s", p->marca);
                printf("\n\tModello: %s", p->modello);
                printf("\n\tUnità : %d \n", p->unita);
                p++;
                scanf("%c", &pausa);
            }
            printf("\n\tPremi un tasto per tornare al menu\n\n\n\n");
            scanf("%c", &pausa);
        }
    }
    
    int Inserimento(int pos){
        char pausa;
        if (pos<MAX) { 
            printf("\n Inserire i dati della nuova auto\n");
            printf("\tMarca:");
            fgets(auto_array[pos].marca,25,stdin);
            printf("\n\tModello:");
            fgets(auto_array[pos].modello,25,stdin);
            printf("\n\tQuante:\t\t");
            scanf("%d", &auto_array[pos].unita);
            pos++;
            printf("\n\tPremi un tasto per tornare al menu\n");
            scanf("%c", &pausa);
            return(pos);}
        else{
            printf("Errore, l'archivio è pieno!");
            scanf("%c", &pausa);
            return(pos);}
        
    }

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,562
    Probabilmente è perché mischi fgets e scanf.
    scanf non pulisce il buffer, quindi prima di utilizzare una fgets devi pulirlo manualmente.
    Aggiungi questo prima di ogni fgets che succede uno scanf
    codice:
    while(getchar()!='\n');
    Attento a non metterla fra 2 fgets però.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    intanto grazie per la risposta!
    Ho provato ma non cambia nulla, ho anche provato ad escludere la parte in cui uso lo scanf ma niente.. quando lo compilo mi chiede correttamente di inserire la Marca ma poi non mi permette di immetterla passando direttamente alla domanda sul Modello.. boo non capisco dove sta l'errore!

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,251
    Comincia, come ti è stato detto, a scrivere nella funzione Menu

    codice:
    scanf("%d",&n);
    while(getchar()!='\n');
    quando chiedi in input il numero dell'opzione
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,562
    Non sono sicuro tu abbia inserito quell'istruzione nel punto giusto, prova così...
    codice:
    #include <stdio.h>
    
    #define MAX 10
    
    struct automobili {
        char marca[25];        
        char modello[25];
        int  unita;
    };
    
    
    struct automobili auto_array[MAX];
    
    int num_auto=0; 
    
    
    int Menu();   
    
    int Inserimento(int);   
    
    void Visualizzazione(int, struct automobili *); 
    
    
    
    
    int main(){
        int scelta=-1;          
        while (scelta!=0) {
            scelta=Menu();
            if (scelta==1){
                num_auto = Inserimento(num_auto);}
            else if(scelta==2) Visualizzazione(num_auto, auto_array);
        }
        printf("\nArrivederci\n");
    }
    
    int Menu(){
        int n;
        do{
            printf("\t-----------------------------------\n");
            printf("\t-------------Archivio--------------\n");
            printf("\t-----------------------------------\n\n");
            printf("\t 1. Inserire una nuova autovettura\n");
            printf("\t 2. Visualizzare archivio\n");
            printf("\t 0. Uscire\n\n");
            printf("\t Cosa vuoi fare?\n \t>>");
            scanf("%d",&n);
        }while (n!=0 && n!=1 && n!=2); 
        return n;
    }
    
    void Visualizzazione(int pos, struct automobili *p){
        int i; //contatore auto
        char pausa;
        if (pos==0) {
            printf("\nIn questo momento non ci sono macchine in garage.\n\n");
            scanf("%c", &pausa);
        }
        else{
            for(i=0; i<pos; i++){
                printf("\n %d° macchina:\n",i+1);
                printf("\tMarca:\t %s", p->marca);
                printf("\n\tModello: %s", p->modello);
                printf("\n\tUnità : %d \n", p->unita);
                p++;
                scanf("%c", &pausa);
            }
            printf("\n\tPremi un tasto per tornare al menu\n\n\n\n");
            scanf("%c", &pausa);
        }
    }
    
    int Inserimento(int pos){
        char pausa;
        if (pos<MAX) { 
            printf("\n Inserire i dati della nuova auto\n");
            printf("\tMarca:");
            while(getchar()!='\n');
            fgets(auto_array[pos].marca,25,stdin);
            printf("\n\tModello:");
            fgets(auto_array[pos].modello,25,stdin);
            printf("\n\tQuante:\t\t");
            scanf("%d", &auto_array[pos].unita);
            pos++;
            printf("\n\tPremi un tasto per tornare al menu\n");
            scanf("%c", &pausa);
            return(pos);}
        else{
            printf("Errore, l'archivio è pieno!");
            scanf("%c", &pausa);
            return(pos);}
        
    }
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  8. #8
    Grazie mille, funziona! Prima lo avevo messo nel posto giusto ma avevo dimenticato il ; perché non avevo capito benissimo il significato, cioè while(getchar()!='\n'); fa in modo che si ignorino i caratteri fino al \n e questo perché pulisce il buffer?
    Scusa la domanda stupida ma come ti dicevo sono proprio alle prime armi!

  9. #9
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,562
    Esatto
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2019 vBulletin Solutions, Inc. All rights reserved.