Stringhe C

alexexposito
Salve, premetto di aver cercato una discussione sull'argomento e di averla trovata, ma non riesco ad implementare il codice in maniera corretta.
Il software punta alla gestione di supermercati mediante file.
Le caratteristiche del supermercato sono:
nome responsabile, cognome responsabile, città, via, num civico, dipendenti, fatturato.

Quando però leggo nome, cognome, città e via, mediante scanf ho la possibilità di leggere una sola stringa fino alla digitazione dello spazio... Ma avrei bisogno che la stringa non venisse troncata, potendo così aggiungere più parole all'interno del campo nome, cognome, città e via.

Ricercando nel forum ho notato che sarebbe da utilizzare la funzione gets, ma mi da errori se la utilizzo...

Vi lascio di seguito il codice, nel caso in cui qualcuno fosse disponibile ad implementare parti di codice:

#include <stdio.h>
#include <string.h>
#define max_stringa 20

typedef struct {
char nome[max_stringa];
char cognome[max_stringa];
char citta[max_stringa];
char via[max_stringa];
int n_civico;
int dipendenti;
float fatturato;
} supermercato;

supermercato superm;

void inserimento(FILE *file1, FILE *file2, int ind);

void ricercaresp(FILE *file1);

void ricercacitta(FILE *file1);

void sup_max_dip(FILE *file1);


int main()
{
FILE *sup;
FILE *appoggio;
int scelta;
int indice;
scelta=1;
sup=fopen("supermercati.txt","r");
if(sup==NULL)
{
fclose(sup);
sup=fopen("supermercati.txt","w");
fclose(sup);
}
else
{
fclose(sup);
}

printf("Software per la gestione dei supermercati.\n");

while(scelta==1 || scelta==2 || scelta==3 || scelta==4)

{
indice=0;
sup=fopen("supermercati.txt","r");
while(!feof(sup))
{
fscanf(sup,"%s %s %s %s %d %d %f\n", superm.nome, superm.cognome, superm.citta, superm.via, &superm.n_civico, &superm.dipendenti, &superm.fatturato);
indice++;
}
if(indice==1 && superm.nome[0]=='\0')
{
    indice=0;
}



printf("\nScegliere una delle seguenti opzioni:\n");
printf("1.Inserire un nuovo supermercato\n");
printf("2.Ricerca del supermercato in base al responsabile\n");
printf("3.Ricerca del numero di supermercati per citta'\n");
printf("4.Ricerca del supermercato con maggior numero di dipendenti\n\n");
printf("Qualunque altro valore portera' al termine dell'esecuzione\n\n");
printf("Scelta: ");
scanf("%d", &scelta);

if(scelta==1)
{
inserimento(sup,appoggio,indice);
}

if(scelta==2)
{
if(indice!=0)
ricercaresp(sup);
else
{
printf("\nNon ci sono supermercati memorizzati.\n");
}
}

if(scelta==3)
{
if(indice!=0)
ricercacitta(sup);
else
{
printf("\nNon ci sono supermercati memorizzati.\n");
}
}

if(scelta==4)
{
if(indice!=0)
sup_max_dip(sup);
else
{
printf("\nNon ci sono supermercati memorizzati.\n");
}
}

}

printf("\n");
printf("Esecuzione terminata.\n");
printf("\n");
return 0;
}


void inserimento(FILE *file1, FILE *file2, int ind)
{

printf("Procedura di inserimento attivata.\n\n");
printf("Inserire il nome del responsabile: ");
scanf("%s", superm.nome);
printf("Inserire il cognome del responsabile: ");
scanf("%s", superm.cognome);
printf("Inserire la citta' nella quale il supermercato e' locato: ");
scanf("%s", superm.citta);
printf("Inserire la via nella quale il supermercato e' locato: ");
scanf("%s", superm.via);
printf("Inserire il numero civico nel quale il supermercato e' locato: ");
scanf("%d", &superm.n_civico);
printf("Inserire i dipendenti del supermercato: ");
scanf("%d", &superm.dipendenti);
printf("Inserire il fatturato dell'ultimo anno del supermercato: ");
scanf("%f", &superm.fatturato);

file1=fopen("supermercati.txt","r");
file2=fopen("appoggio.txt","w");

if(ind==0)
{
fprintf(file2,"%s %s %s %s %d %d %f\n", superm.nome, superm.cognome, superm.citta, superm.via, superm.n_civico, superm.dipendenti, superm.fatturato);
}
else
{
fprintf(file2,"%s %s %s %s %d %d %f\n", superm.nome, superm.cognome, superm.citta, superm.via, superm.n_civico, superm.dipendenti, superm.fatturato);
while(!feof(file1))
{
fscanf(file1,"%s %s %s %s %d %d %f\n", superm.nome, superm.cognome, superm.citta, superm.via, &superm.n_civico, &superm.dipendenti, &superm.fatturato);
fprintf(file2,"%s %s %s %s %d %d %f\n", superm.nome, superm.cognome, superm.citta, superm.via, superm.n_civico, superm.dipendenti, superm.fatturato);
}

fclose(file1);
fclose(file2);
}

file1=fopen("supermercati.txt","w");
file2=fopen("appoggio.txt","r");


while(!feof(file2))
{
fscanf(file2,"%s %s %s %s %d %d %f\n", superm.nome, superm.cognome, superm.citta, superm.via, &superm.n_civico, &superm.dipendenti, &superm.fatturato);
fprintf(file1,"%s %s %s %s %d %d %f\n", superm.nome, superm.cognome, superm.citta, superm.via, superm.n_civico, superm.dipendenti, superm.fatturato);
}

fclose(file1);
fclose(file2);
}



void ricercaresp(FILE *file1)
{
int FLAG;
char ricercanome[max_stringa];
char ricercacognome[max_stringa];
FLAG=0;
printf("Procedura di ricerca supermercato per responsabile attivata.\n\n");
printf("Inserire il nome del responsabile: ");
scanf("%s", ricercanome);
printf("Inserire il cognome del responsabile: ");
scanf("%s", ricercacognome);

file1=fopen("supermercati.txt","r");
while(!feof(file1))
{
fscanf(file1,"%s %s %s %s %d %d %f\n", superm.nome, superm.cognome, superm.citta, superm.via, &superm.n_civico, &superm.dipendenti, &superm.fatturato);
if(strcmp(ricercanome,superm.nome)==0 && strcmp(ricercacognome,superm.cognome)==0)
{
printf("I dati del supermercato corrispondenti al responsabile ricercato sono:\n\n");
printf("|%15s|%15s|%10s|%10s|%10s|%12s|%10s|\n\n","Nome","Cognome","Citta'","Via","N.Civico","Dipendenti","Fatturato");
printf("|%15s|%15s|%10s|%10s|%10d|%12d|%10.2f|\n", superm.nome, superm.cognome, superm.citta, superm.via, superm.n_civico, superm.dipendenti, superm.fatturato);
FLAG=1;
}
}
if(FLAG==0){printf("\nNominativo responsabile inesistente.\n");}
fclose(file1);

}




void ricercacitta(FILE *file1)
{
int FLAG;
char cercacitta[max_stringa];
int contasup;
FLAG=0;
contasup=0;
printf("Procedura di ricerca del numero dei supermercati per citta' attivata.\n\n");
printf("Inserire la citta': ");
scanf("%s", cercacitta);
file1=fopen("supermercati.txt","r");
while(!feof(file1))
{
fscanf(file1,"%s %s %s %s %d %d %f\n", superm.nome, superm.cognome, superm.citta, superm.via, &superm.n_civico, &superm.dipendenti, &superm.fatturato);
if(strcmp(cercacitta,superm.citta)==0)
{contasup=contasup+1;
FLAG=1;}
}
fclose(file1);
if(FLAG==1)
printf("\n%s%s%s%d.\n","Il numero di supermercati all'interno di ", cercacitta, " e' ", contasup);
else
printf("\nNon sono presenti supermercati all'interno di %s.\n",cercacitta);

}





void sup_max_dip(FILE *file1)
{
int massimo;

printf("\nDi seguito saranno riportati i dati del supermercato col maggior numero di dipendenti.\n\n");
file1=fopen("supermercati.txt","r");
fscanf(file1,"%s %s %s %s %d %d %f\n", superm.nome, superm.cognome, superm.citta, superm.via, &superm.n_civico, &superm.dipendenti, &superm.fatturato);
massimo=superm.dipendenti;
while(!feof(file1))
{
fscanf(file1,"%s %s %s %s %d %d %f\n", superm.nome, superm.cognome, superm.citta, superm.via, &superm.n_civico, &superm.dipendenti, &superm.fatturato);
if(superm.dipendenti>massimo) {massimo=superm.dipendenti;}
}
fclose(file1);
file1=fopen("supermercati.txt","r");

printf("I dati dei/del supermercato/i con il maggior numero di dipendenti sono:\n\n");
printf("|%15s|%15s|%10s|%10s|%10s|%12s|%10s|\n\n","Nome","Cognome","Citta'","Via","N.Civico","Dipendenti","Fatturato");
while(!feof(file1))
{
fscanf(file1,"%s %s %s %s %d %d %f\n", superm.nome, superm.cognome, superm.citta, superm.via, &superm.n_civico, &superm.dipendenti, &superm.fatturato);
if(massimo==superm.dipendenti)
{
printf("|%15s|%15s|%10s|%10s|%10d|%12d|%10.2f|\n", superm.nome, superm.cognome, superm.citta, superm.via, superm.n_civico, superm.dipendenti, superm.fatturato);
}
}
fclose(file1);
}


Risposte
apatriarca
Usando scanf non è possibile. Devi leggere l'intera riga di input e spezzare manualmente le parole.

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