Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    7

    Copiare stringhe da una riga all'altra di una matrice

    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
    codice:
    while ( Mat[m][n] != '\0' ) {
    ...
    }
    oppure un ciclo del tipo
    codice:
    int i = 0;
    while( i < n ) {
    ...
    }
    ?

    Perchè?

  2. #2
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Puoi usare direttamente la strcpy.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    7
    Cosa dovrei inserire come argomento?
    Come posso estrarre una stringa dalla matrice e memorizzarla, ad esempio, nell'oggetto string s1?

  4. #4
    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:

    codice:
    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++;
         }
    }

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    7
    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.

  6. #6

    Moderazione

    Manca il linguaggio di riferimento e relativo tag nel titolo... Stiamo parlando di C, C++ o altro ancora?
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    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.
    codice:
    void svuota(char &stringa, int dimensione)
    {
         for(int i=0; i<dimensione; i++)
         {
          stringa[i]= " ";
         }
    return;
    }

  8. #8
    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:
    codice:
    string s1(Mat[3]); // copia la quarta stringa nell'oggetto s1
    Ma di nuovo, devi specificare se stiamo parlando di C o C++.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    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.

  10. #10
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.