PDA

View Full Version : [C]Problema assurdo e inaspettato nel stampare una stringa


The-Revenge
09-12-2009, 18:28
Ciao ragazzi, allora ho fatto questo semplice programmino in C usando struct, puntatori e funzioni, per esercitarmi. Il programm richiede i'inseirmento di 4 struct libri manualmente, che hanno alcune propietà, e di vedere quale di questi costa di più e poi stampare il nome del libro.
Bene, funziona tutto (come andrete a notare nel programma ho anche stampato una variabile temproanea max per vedere se il risultato era giusto) ma non mi stampa il titolo del libro che costa di più. Potete vedere perchè? inizialmente il costo era in float, poi pensavo che ci fosse qualche errore nella comparazione, dato che non so perchè quando inserivo il float mi aggiungeva sempre un numero casuale dopo tutti gli 0, e fare un cast del float a sole 2 cifre decimali mi dava un errore.

Comuqnue ecco il codice :

#include<stdio.h>
#include<stdlib.h>
struct libro {
char *titolo;
char *autore;
char *editore;
int anno;
int ISBN;
int prezzo;
};
void inserimento_libro(struct libro *,int);
void calcolo_prezzi(struct libro *,struct libro *,struct libro *,struct libro *);
void cambia(int *,int *);
int main(){

struct libro L1,L2,L3,L4;
struct libro *pl1,*pl2,*pl3,*pl4;
pl1=&L1;
pl2=&L2;
pl3=&L3;
pl4=&L4;
inserimento_libro(pl1,1);
inserimento_libro(pl2,2);
inserimento_libro(pl3,3);
inserimento_libro(pl4,4);
calcolo_prezzi(pl1,pl2,pl3,pl4); //calcolare max prezzo, min prezzo, media prezzo, titolo caratteri maggiori.
printf("\n\n");
system("PAUSE");
return(0);
}


//funzione che richiedere l'inserimento dei valori dei 4 libri
void inserimento_libro(struct libro *a,int b){

printf("\nInserisci titolo libro %d : ",b);
scanf("%s",&a->titolo);
printf("\nInserisci autore libro %d : ",b);
scanf("%s",&a->autore);
printf("\nInserisci editore libro %d : ",b);
scanf("%s",&a->editore);
printf("\nInserisci anno di edizione libro %d : ",b);
scanf("%d",&a->anno);
printf("\nInserisci codice ISBN libro %d : ",b);
scanf("%d",&a->ISBN);
printf("\nInserisci prezzo %d libro : ",b);
scanf("%d",&a->prezzo);
printf("\n\n");
}

void calcolo_prezzi(struct libro *a,struct libro *b,struct libro *c,struct libro *d){
int prezzi[4]={a->prezzo,b->prezzo,c->prezzo,d->prezzo};
int *pprezzi;
pprezzi=prezzi;
int max;
max=prezzi[0];
for(int i=1;i<4;i++)
if(prezzi[i]>max)cambia(pprezzi+i,&max);
printf("%d",max);
printf("\nIl libro piu' costoso e' : ");
if(max==prezzi[0])printf("%s",a->titolo);
if(max==prezzi[1])printf("%s",b->titolo);
if(max==prezzi[2])printf("%s",c->titolo);
if(max==prezzi[3])printf("%s",d->titolo);
}

void cambia(int *a,int *b){
int temp;
temp= *a;
*a= *b;
*b=temp;
}

maulattu
09-12-2009, 18:54
quando fai la scanf con %s, nella variabile del 2° argomento di scanf non devi mettere la &
es:
char *string
scanf("%s", string)

e non scanf("%s", &string)

The-Revenge
09-12-2009, 19:10
quando fai la scanf con %s, nella variabile del 2° argomento di scanf non devi mettere la &
es:
char *string
scanf("%s", string)

e non scanf("%s", &string)
ma questo vale solo per le stringe?
Comunque ora provo e ti faccio sapere
EDIT : scusa ma senza & il programma smette di funzionare..uso DEVCPP

wingman87
09-12-2009, 19:20
Non ne sono sicuro ma credo che & abbia la precedenza su ->. In tal caso bisogna rivedere tutte le scanf:
//funzione che richiedere l'inserimento dei valori dei 4 libri
void inserimento_libro(struct libro *a,int b){

printf("\nInserisci titolo libro %d : ",b);
scanf("%s",a->titolo);
printf("\nInserisci autore libro %d : ",b);
scanf("%s",a->autore);
printf("\nInserisci editore libro %d : ",b);
scanf("%s",a->editore);
printf("\nInserisci anno di edizione libro %d : ",b);
scanf("%d",&(a->anno));
printf("\nInserisci codice ISBN libro %d : ",b);
scanf("%d",&(a->ISBN));
printf("\nInserisci prezzo %d libro : ",b);
scanf("%d",&(a->prezzo));
printf("\n\n");
}

wingman87
09-12-2009, 19:24
Ho provato il programma, il problema è che non hai allocato lo spazio per le stringhe della struttura libro. Se ne hai la possibilità dichiarerei la dimensione in modo statico, così ti risparmi un sacco di noie con l'allocazione/deallocazione

edit: quindi ad esempio:

struct libro {
char titolo[40];
char autore[40];
char editore[40];
int anno;
int ISBN;
int prezzo;
};

The-Revenge
09-12-2009, 19:39
Ho provato il programma, il problema è che non hai allocato lo spazio per le stringhe della struttura libro. Se ne hai la possibilità dichiarerei la dimensione in modo statico, così ti risparmi un sacco di noie con l'allocazione/deallocazione

edit: quindi ad esempio:

struct libro {
char titolo[40];
char autore[40];
char editore[40];
int anno;
int ISBN;
int prezzo;
};

ok, ti ringrazio. ma visto che ci sono ti chiedo : cosa cambia dal dichiarare lo spazio, o dichiarare il puntatore?
Io in un esercizio rpecedente ho dichirato col puntatore ed è andato tutto bene, è forse perchè poi ho inserito manualmente la frase?

wingman87
09-12-2009, 19:42
Quando dichiari il puntatore dichiari lo spazio per contenere l'indirizzo di un'area di memoria ma non allochi questa memoria.
Quando invece specifichi la dimensione dichiari un puntatore contenente l'indirizzo di un'area di memoria della dimensione specificata.

maulattu
10-12-2009, 23:06
char *titolo
titolo è un puntatore a char. A cosa punta? Boh! Lo devi inizializzare, cioè devi creare una zona di memoria ("allocare") che è puntata da char, es:
titolo = (char *) calloc(n, sizeof(char))
alloca una zona di memoria di n elementi ciascuno di dimensione "sizeof(char)" e tale zona di memoria sarà raggiungibile da titolo, es: "titolo[2]".
Prima di utilizzarla verifica che titolo sia != NULL (vedi la documentazione sulla calloc)
Alla fine ricordati di liberare tale zona di memoria allocata:
free(titolo)

char titolo[40]
titolo è un array di 40 char