Precedente :: Successivo |
Autore |
Messaggio |
saetta Eroe in grazia degli dei

Registrato: 25/02/08 11:52 Messaggi: 129
|
Inviato: 09 Set 2008 09:27 Oggetto: stringa capricciosa? |
|
|
Quali possono essere i motivi per cui una printf mi stampa %s invece che la stringa a cui mi riferisco???
riporto il codice:
Codice: |
void print_cells(game_t *g)
{
cell_t *c;
c = g->cells;
char *e;
e = "end";
while(c->test != e)
{
/* c->test è un char* nella struct cell */
printf("Casella num:%d \nProva: %s ",c->num, c->test); /*viene stampato il num corretto ma la stringa no!!! Mi stampa al suo posto "%s"*/
printf("\n\n");
c = c->next;
} |
Mentre in questo codice funziona tutto bene e vedo che cosa è scritto nella stringa.(lo eseguo prima di chiamare la print_cell(), solo per controllare il contenuto della stringa, e funziona bene.)
Codice: |
int get_conf_line(game_t *g, int *n, char *s){
FILE *fc;
char *d, *tmp;
int i;
i=0;
fc = g->config;
if(fgets(d, 100, fc) == NULL)
return -1;
do{
tmp[i]=d[i];
i++;
}while(d[i]!=':');
*n = atoi(tmp);
i++;
d=&d[i];
printf("get_line_conf()=> cella%d, test:%s\n",*n,d); /*questo funziona!!!*/
return 0;
}/*get_conf_line()*/
|
|
|
Top |
|
 |
freemind Supervisor sezione Programmazione


Registrato: 04/04/07 21:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 09 Set 2008 23:31 Oggetto: |
|
|
Strano.
Non mi sembra di veder nulla che non vada.
Ho provato a fare delle prove con le stringhe giocando con i puntatori ma son sempre riuscito a stampare quello che volevo.
Bisognerebbe indagare.
Non è che puoi postare un po' più di codice, magari le struct che usi? |
|
Top |
|
 |
saetta Eroe in grazia degli dei

Registrato: 25/02/08 11:52 Messaggi: 129
|
Inviato: 10 Set 2008 08:27 Oggetto: |
|
|
Beh...si... grazie ancora.
Codice: |
/**singola casella*/
typedef struct cell {
/**numero della casella*/
int num;
/**prova associata alla casella*/
char *test;
/**prossima casella */
struct cell *next;
/**precedente casella */
struct cell *prev;
}cell_t;
/**giocatore*/
typedef struct player{
/**identificatore numerico unico per il giocatore*/
int id;
/**nome giocatore*/
char *name;
/**posizione attuale del giocatore*/
cell_t *position;
/**ultimo lancio del dado*/
dice6_t last_launch;
/**flag per il giocatore attivo/disattivo*/
bool_t aviable;
/**quantità di caselle superate rispetto all'arrivo*/
int surplus;
/**prossimo giocatore*/
struct player *next;
}player_t;
typedef struct game{
/**numero caselle*/
int n_cells;
/**lista delle caselle*/
struct cell *cells;
/**numero giocatori*/
int n_players;
/**lista dei giocatori*/
player_t *players;
/**puntatore al(descrittore) file di configurazione*/
FILE *config;
/**puntatore al file di log*/
FILE *log;
}game_t;
|
|
|
Top |
|
 |
freemind Supervisor sezione Programmazione


Registrato: 04/04/07 21:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 10 Set 2008 11:54 Oggetto: |
|
|
Ora non riesco a fare delle prove, più tardi provo anche se a colpo d'occhio non mi viene in mente nulla. |
|
Top |
|
 |
saetta Eroe in grazia degli dei

Registrato: 25/02/08 11:52 Messaggi: 129
|
Inviato: 10 Set 2008 19:17 Oggetto: |
|
|
No, no ci siamo proprio...
ho scritto ANCHE una f.ne per la stampa di players, campo di game_t , semplicemente dovrebbe visualizzare :
Giocatore : zeus
id: 1
(.......)
Giocatore: apollo
id: 12
---invece visualizza:
Giocatore : apollo
id: 1
(...)
Giocatore : apollo
id: 12
Insomma come se tutti i giocatori fossero inizializzati con lo stesso nome di quello inserito per ultimo... cosa che non avviene inquanto dentro alla f.ne di inizializzazione e inserimento del giocatore, si chiede da tastiera il nome (che prendo con una scanf() e controllo a video (x me) con una printf()) con un ciclo del tipo
Codice: | for(i=0 ,i<num_giocatori, i++)
{
chiedi nome
mettilo in char *s ( con scanf() )
chiama la aggiungi_giocatore(gioco, nome_giocatore)
} |
L'unica cosa che mi viene da pensare è che ho un demone nel pc che si è mangiato l'implementazione di tutte le funzioni che riguardano le stringhe.
 |
|
Top |
|
 |
freemind Supervisor sezione Programmazione


Registrato: 04/04/07 21:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 10 Set 2008 22:24 Oggetto: |
|
|
Dopo aver letto con scanf prova a fare un fflush(stdin) che si trova in stdio.h.
Le stringhe è meglio però se le leggi con getline perchè così puoi inserire anche gli spazi (se non ti servono va bene anche la scanf).
P.S.
Per l'altro problema (quello del test) non ho ancora una soluzione, in verità non ho ancora guardato bene la cosa.  |
|
Top |
|
 |
chemicalbit Dio maturo


Registrato: 01/04/05 18:59 Messaggi: 18597 Residenza: Milano
|
Inviato: 10 Set 2008 23:42 Oggetto: |
|
|
Ma la stampa (printf) della parte relativa al giocatore 1, la fai prima o dopo di acquisire con scanf i dati relativi al giocatore successivo? |
|
Top |
|
 |
saetta Eroe in grazia degli dei

Registrato: 25/02/08 11:52 Messaggi: 129
|
Inviato: 11 Set 2008 08:48 Oggetto: |
|
|
avevo già provato con fflush:
Codice: | {...scanf("%s",s); printf("stinga = %s",str); fflush(stdin);...}
|
Inoltre getline() non è una f.ne ANSI-C, vero? In tal caso non posso usarla, al max potrei definirmela come consiglia il K&R pag 66.
La f.ne di stampa la mando dal main dopo aver inserito i giocatori, per ora x controllare che siano stati inseriti correttamente:
Codice: | main()
{
...
printf("num giocatori?");
scanf("%d",&num);
for(i=0;i<num;i++)
{
1)chiedi nome giocatore
2)prendilo con scanf
<--- se qui ci metto una printf("%s",nomegiocatore) lo scrive bene
3)usalo x la f.ne di aggiunta giocatore
}
stampa_giocatori(...)<---il nome(char *) di tutti i giocatori è quello dell'ultimo inserito ma l'id (int) è quello corretto di ciascuno(!!!)
<---se qui ci metto una:
printf("nome g1= %s, nome g2=%s",gioco->players->nome, gioco->players->next->nome);
mi stampa: "g1 = apollo, g2 = apollo "
ret(0);
}/*fine main()*/ |
Per rispondere a chemicalbit:
se la faccio prima (nel for allo stesso "i"), mi stampa correttamente
se invece la faccio dal main(con o senza la f.ne di stampa mia), dopo aver inserito tutti i giocatori, si ha l'inconveniente che tutti si chiamano come l'ultimo inserito...
come dove e quando sovrascrive la stringa il mio demone del pc?
Grazie 1000 ragazzi, sto impazzendo!!! |
|
Top |
|
 |
chemicalbit Dio maturo


Registrato: 01/04/05 18:59 Messaggi: 18597 Residenza: Milano
|
Inviato: 11 Set 2008 09:06 Oggetto: |
|
|
saetta ha scritto: | Per rispondere a chemicalbit:
se la faccio prima (nel for allo stesso "i"), mi stampa correttamente | Allora non penso sia un problema di fflush.
saetta ha scritto: | se invece la faccio dal main(con o senza la f.ne di stampa mia), dopo aver inserito tutti i giocatori, si ha l'inconveniente che tutti si chiamano come l'ultimo inserito... | Ma quindi nel momento in cui stampi, la variabile cosa contiene? Forse è "giusto" che stampi sempre lo stesso nome.[/quote]
I vari nomi dove li memorizzi, in un'unica variabile (anzi in un'unica stringa)? |
|
Top |
|
 |
saetta Eroe in grazia degli dei

Registrato: 25/02/08 11:52 Messaggi: 129
|
Inviato: 11 Set 2008 09:58 Oggetto: |
|
|
RISOLTO...
ve lo devo proprio dire...?
Non allocavo memoria per la stringa del nome...
grazie a tutti!!! |
|
Top |
|
 |
|