Indice del forum Olimpo Informatico
I Forum di Zeus News
Leggi la newsletter gratuita - Attiva il Menu compatto
 
 FAQFAQ   CercaCerca   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati 
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

    Newsletter RSS Facebook Twitter Contatti Ricerca
stringa capricciosa?
Nuovo argomento   Rispondi    Indice del forum -> Programmazione
Precedente :: Successivo  
Autore Messaggio
saetta
Eroe in grazia degli dei
Eroe in grazia degli dei


Registrato: 25/02/08 11:52
Messaggi: 129

MessaggioInviato: 09 Set 2008 09:27    Oggetto: stringa capricciosa? Rispondi citando

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
Profilo Invia messaggio privato
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 21:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 09 Set 2008 23:31    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
saetta
Eroe in grazia degli dei
Eroe in grazia degli dei


Registrato: 25/02/08 11:52
Messaggi: 129

MessaggioInviato: 10 Set 2008 08:27    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 21:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 10 Set 2008 11:54    Oggetto: Rispondi citando

Ora non riesco a fare delle prove, più tardi provo anche se a colpo d'occhio non mi viene in mente nulla.
Top
Profilo Invia messaggio privato
saetta
Eroe in grazia degli dei
Eroe in grazia degli dei


Registrato: 25/02/08 11:52
Messaggi: 129

MessaggioInviato: 10 Set 2008 19:17    Oggetto: Rispondi citando

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.

Crying or Very sad
Top
Profilo Invia messaggio privato
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 21:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 10 Set 2008 22:24    Oggetto: Rispondi citando

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. Embarassed
Top
Profilo Invia messaggio privato
chemicalbit
Dio maturo
Dio maturo


Registrato: 01/04/05 18:59
Messaggi: 18597
Residenza: Milano

MessaggioInviato: 10 Set 2008 23:42    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
saetta
Eroe in grazia degli dei
Eroe in grazia degli dei


Registrato: 25/02/08 11:52
Messaggi: 129

MessaggioInviato: 11 Set 2008 08:48    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
chemicalbit
Dio maturo
Dio maturo


Registrato: 01/04/05 18:59
Messaggi: 18597
Residenza: Milano

MessaggioInviato: 11 Set 2008 09:06    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
saetta
Eroe in grazia degli dei
Eroe in grazia degli dei


Registrato: 25/02/08 11:52
Messaggi: 129

MessaggioInviato: 11 Set 2008 09:58    Oggetto: Rispondi

RISOLTO...
ve lo devo proprio dire...?Damn!
Non allocavo memoria per la stringa del nome...
Embarassed

grazie a tutti!!!
Top
Profilo Invia messaggio privato
Mostra prima i messaggi di:   
Nuovo argomento   Rispondi    Indice del forum -> Programmazione Tutti i fusi orari sono GMT + 2 ore
Pagina 1 di 1

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi