PDA

Visualizza la versione completa : [C] Gestione archivio (era: "Programmare in C")


oblomova
14-12-2013, 17:25
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:


#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!

Scara95
14-12-2013, 18:02
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 (http://www.cplusplus.com/reference/cstdio/fgets)...
Manca un \ e non serve quella s
scanf("%[^\n]", auto_array[pos].marca)

oblomova
14-12-2013, 18:34
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:


#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);}

}

Scara95
15-12-2013, 11:20
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
while(getchar()!='\n');
Attento a non metterla fra 2 fgets però.

oblomova
15-12-2013, 14:37
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!

oregon
15-12-2013, 14:48
Comincia, come ti è stato detto, a scrivere nella funzione Menu



scanf("%d",&n);
while(getchar()!='\n');


quando chiedi in input il numero dell'opzione

Scara95
15-12-2013, 15:11
Non sono sicuro tu abbia inserito quell'istruzione nel punto giusto, prova così...


#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);}

}

oblomova
15-12-2013, 17:07
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!:confused:

Scara95
15-12-2013, 17:09
Esatto :ciauz:

Loading