PDA

Visualizza la versione completa : [C/C++?] Copiare stringhe da una riga all'altra di una matrice


jok1ng
05-09-2012, 19:54
Salve ragazzi,
ho una piccolo dubbio riguardante la memorizzazione di stringhe in una matrice.

Sia Mat[m][n] una matrice in cui vi sono memorizzate diverse stringhe, una per riga. Supponiamo che la lunghezza di ogni stringa vari, sebbene nessuna superi gli n-1 caratteri.
Se voglio copiare, per poi stampare, una stringa su un'altra riga, mi conviene utilizzare un ciclo del tipo


while ( Mat[m][n] != '\0' ) {
...
}

oppure un ciclo del tipo


int i = 0;
while( i < n ) {
...
}

?

Perchè?

Who am I
05-09-2012, 21:34
Puoi usare direttamente la strcpy (http://www.cplusplus.com/reference/clibrary/cstring/strcpy/).

jok1ng
05-09-2012, 21:40
Cosa dovrei inserire come argomento?
Come posso estrarre una stringa dalla matrice e memorizzarla, ad esempio, nell'oggetto string s1?

MegaAlchimista
05-09-2012, 21:47
Dipende da come sono fatte le stringe e da che dato vuoi estrarre tu.

Con il primi ciclo prendi tutti i caratteri finchè non trovi il carattere di fine stringa.
Quindi se n diciamo vale 10, ma alla m-esima riga c'è una stringa di 3caratteri, tu tirerai fuori una stringa di 3 carateri.
Con il secondo metodo invece (suppongo che incrementi i) prendi n caratteri, qualsiasi cosa contengano.

Per inciso:
Credo che il primo while vada messo dentro un for che scorra lungo le righe, da 0 a m-1? Una cosa del genere:



char Mat[10][10];
char str[10];
int n;
for(int m=0; m<10; m++)
{
n=0;
while ( Mat[m][n] != '\0' )
{
str[n]= Mat[m][n];
n++;
}
}

jok1ng
05-09-2012, 21:58
Il mio dubbio nasce dal fatto che se provo a ricopiare una stringa da una riga che è più corta di quella alla riga dove vado ad "incollarla", non so se mi cancella poi gli altri caratteri, quelli che "avanzano".
Per questo chiedevo se fosse più appropriato copiare la riga INTERA, senza quindi considerare il carattere di fine stringa, in modo da sovrascrivere tutta la riga.

MItaly
05-09-2012, 22:08
Manca il linguaggio di riferimento e relativo tag nel titolo... :stordita: Stiamo parlando di C, C++ o altro ancora?

MegaAlchimista
06-09-2012, 12:20
Originariamente inviato da jok1ng
Il mio dubbio nasce dal fatto che se provo a ricopiare una stringa da una riga che è più corta di quella alla riga dove vado ad "incollarla", non so se mi cancella poi gli altri caratteri, quelli che "avanzano".
Per questo chiedevo se fosse più appropriato copiare la riga INTERA, senza quindi considerare il carattere di fine stringa, in modo da sovrascrivere tutta la riga.

Ma tu sai cosa c'è nelle righe della matrice Dopo il carattere di fine stringa? Se ci sono caratteri acaso credo non valga la pena di copiarli: piuttosto io farei una semplice funzione "svuota" che riempie l'intera stringa con il carattere spazio o con "_", o con qualsiasi altro carattere tu voglia.


void svuota(char &stringa, int dimensione)
{
for(int i=0; i<dimensione; i++)
{
stringa[i]= " ";
}
return;
}

MItaly
06-09-2012, 15:17
Originariamente inviato da jok1ng
Il mio dubbio nasce dal fatto che se provo a ricopiare una stringa da una riga che è più corta di quella alla riga dove vado ad "incollarla", non so se mi cancella poi gli altri caratteri, quelli che "avanzano".
Per questo chiedevo se fosse più appropriato copiare la riga INTERA, senza quindi considerare il carattere di fine stringa, in modo da sovrascrivere tutta la riga.
È inutile cancellare i caratteri che vengono dopo, l'unica accortezza necessaria è assicurarsi di copiare anche il carattere di fine stringa (cosa a cui strcpy provvede automaticamente).

Originariamente inviato da jok1ng
Cosa dovrei inserire come argomento?
Come posso estrarre una stringa dalla matrice e memorizzarla, ad esempio, nell'oggetto string s1?
Stiamo parlando di std::string (e quindi di C++)? In tal caso, è sufficiente usare il suo costruttore che accetta una stringa C come argomento:


string s1(Mat[3]); // copia la quarta stringa nell'oggetto s1


Ma di nuovo, devi specificare se stiamo parlando di C o C++.

MegaAlchimista
06-09-2012, 16:18
Guarda MItaly, io non credo che stia usando le stringhe perchè altrimenti quella non sarebbe una matrice, ma un vettore di stringhe

(come hai scritto tu sarebbe inizializzato
string Mat[3];
e non
char Mat[3][3];
)

Per questo avevo dato per scontato che non potesse usare std::string

Poi per carità un vettore distringhe, se vogliamo, è comunque una matrice. Ma dato che lui aveva scritto Mat[m][n] ho creduto che fosse proprio la sua inizializzazione e che quindi fosse di tipo char.

MItaly
06-09-2012, 17:14
Originariamente inviato da MegaAlchimista
Guarda MItaly, io non credo che stia usando le stringhe perchè altrimenti quella non sarebbe una matrice, ma un vettore di stringhe

Credo anch'io che quella sia una matrice di stringhe C (ovvero, un char[][]), parlavo di std::string solo perché lui ad un certo punto ha scritto:

Come posso estrarre una stringa dalla matrice e memorizzarla, ad esempio, nell'oggetto string s1?
Poi boh, lo sa solo lui che cosa intendesse dire, aspettiamo lumi. :D

Loading