PDA

Visualizza la versione completa : [C++] Swap di stringhe


darksergio
19-02-2011, 19:15
ho creato questa function per invertire l'ordine di visualizzazione di due array di tipo stringa,
ma non so perchŔ mi inverte solo la prima lettera, come se non si rendesse conto che si tratta di una stringa o come se non considerasse la dereferenziazione a indirizzo base... non capisco perchŔ.


void cswap(char *p, char *q) { char tmp; tmp=*p; *p=*q; *q=tmp; }
:messner:

grazie in anticipo :)

darksergio
19-02-2011, 19:22
nessuno ne sa il motivo???

Alex'87
19-02-2011, 19:26
p Ŕ l'indirizzo del primo carattere
*p Ŕ il primo carattere

darksergio
19-02-2011, 19:29
non sei stato molto esaustivo, come faccio a invertire tutte le stringhe e non solo la prima lettera??

Alex'87
19-02-2011, 19:38
Originariamente inviato da darksergio
non sei stato molto esaustivo, come faccio a invertire tutte le stringhe e non solo la prima lettera??Studiando come vanno gestite le stringhe in C :stordita:
Una stringa non si copia in un'altra usando l'operatore di assegnamento ma si utilizza una funzione particolare, strcpy. Per usarla devi includere l'header string.h.

darksergio
19-02-2011, 19:42
io non voglio copiare una stringa su un altra....
voglio invertirle di posizione... es:

mario rossi lucia verdi
---------->
lucia verdi mario rossi

con lo string copy dovrei crearmi una stringa fittizia e invertire tutto
vorrei evitarlo se Ŕ possibile con la notazione a puntatore, non si pu˛?

Alex'87
19-02-2011, 20:12
Originariamente inviato da darksergio
con lo string copy dovrei crearmi una stringa fittizia e invertire tutto
vorrei evitarlo se Ŕ possibile con la notazione a puntatore, non si pu˛? No. Per scambiare due stringhe ti serve necessariamente una terza stringa di appoggio.

MItaly
19-02-2011, 20:27
Oddio, in realtÓ puoi scambiare un carattere per volta iterando, ma il problema Ŕ che devi essere sicuro che entrambe le stringhe abbiano capacitÓ sufficiente.

darksergio
19-02-2011, 20:44
si, ho fatto, ora ho un secondo problema....
per modificare il tabellone punteggi di una corsa ciclistica
ho scritto questo if che dovrebbe effettuarmi vari swap:



if ( tempi_classifica[e]> tempi_classifica[i]) { cswap(corridore[e].nome, corridore[i].nome); cswap(corridore[e].cognome, corridore[i].cognome); iswap(&tempi_classifica[e],&tempi_classifica[i]); iswap(&ciclisti_classifica[e],&ciclisti_classifica[i]); iswap(&caselle_classifica[e],&caselle_classifica[i]); iswap(&giri_classifica[e],&giri_classifica[i]); iswap(&caselle_giro_classifica[e],&caselle_giro_classifica[i]); }

con queste funzioni:

iswap: (per gli interi)


#include <stdio.h> #include "mylib.h" void iswap(int *p, int*q) { int tmp; tmp=*p; *p=*q; *q=tmp; }

cswap: (per le stringhe)


#include <stdio.h> #include <string.h> #include "mylib.h" void cswap(char *p, char *q) { char tmp[20]; strcpy(tmp,q); strcpy(q,p); strcpy(p,tmp); }

stranamente tutti gli iswap si muovono cordinatamente fra loro, mentre i cswap, seppur muovendosi non cordinano gli spostamenti con gli iswap.

mi spiego meglio:

ho questa layout:

'nome' 'cognome' n oo:mm:ss n_giri caselle_percorse

da n in poi si muovono tutti cordinatamente mentre il nome ed il cognome rimangono vicini fra loro ma si spostano scambiano seguendo una logica a me sconosciuta xD

mi stanno fumando le orecchie xD

grazie in anticipo, anche se questa Ŕ davvero difficile

Loading