Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 23
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    165

    [c++]Funzione per concatenare in una stringa un vettore di interi

    salve, forse il titolo del post non è chiarissimo, ma forse è più facile spiegare la cosa con più parole:

    Ho un vettore di interi che chiameremo "vect" così formato:
    vect[0]=1;
    vect[1]=2;
    vect[2]=3;
    vect[3]=4;

    e vorrei ottenere una stinga di caratteri che contiene "1 2 3 4"

    come posso fare?

    grazie 10000!

  2. #2
    codice:
    #include <sstream>
    #include <string>
    #include <cstddef>
    
    // ...
    std::ostringstream os;
    for(std::size_t i=0; i<NumeroElementi; ++i)
    {
        if(i!=0)
           os<<" ";
        os<<vect[i];
    }
    std::string str=os.str(); // in str ora c'è "1 2 3 4"
    Versione in stile programmazione funzionale:
    codice:
    #include <sstream>
    #include <string>
    #include <iterator>
    
    // ...
    std::ostringstream os;
    std::copy(vect, vect+NumeroElementi, std::ostream_iterator<int>(os," "));
    std::string str=os.str(); // in str ora c'è "1 2 3 4 "
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    165
    Originariamente inviato da MItaly
    codice:
    #include <sstream>
    #include <string>
    #include <cstddef>
    
    // ...
    std::ostringstream os;
    for(std::size_t i=0; i<NumeroElementi; ++i)
    {
        if(i!=0)
           os<<" ";
        os<<vect[i];
    }
    std::string str=os.str(); // in str ora c'è "1 2 3 4"
    Versione in stile programmazione funzionale:
    codice:
    #include <sstream>
    #include <string>
    #include <iterator>
    
    // ...
    std::ostringstream os;
    std::copy(vect, vect+NumeroElementi, std::ostream_iterator<int>(os," "));
    std::string str=os.str(); // in str ora c'è "1 2 3 4 "
    scusa la mia ignoranza abissale, ma io dovrei fare una cosa del genere:


    codice:
    char stringa; //o "char* stringa;" ? che confusione che ho in testa ora!
    stringa=concatena_stringa(vettore);//concatena_stringa avrà il corpo da te proposto
    elabora_stringa(stringa); //elabora_stringa elabora una stringa del tipo "ciao 3 4 5 !"
    solo che non so come costruire l'intestazione della funzione concatena_stringa! Dovrei far tornare un char o un char* alla funzione?
    Potresti spiegarmi come si fa? Non so perchè ma faccio programmi anche molto complessi e poi quando vado sui tipi char mi sento un idiota!

    P.S. le librerie che hai indicato le trovo anche su Linux?
    Grazie, e scusa per il disturbo!

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Partiamo da alcune certezze ... tu programmi in C++ (come da titolo) e quindi utilizzi oggetti di tipo string o programmi in C e quindi utilizzi vettori di char?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    165
    Originariamente inviato da oregon
    Partiamo da alcune certezze ... tu programmi in C++ (come da titolo) e quindi utilizzi oggetti di tipo string o programmi in C e quindi utilizzi vettori di char?
    il file è c++ (per esigenze di librerie esterne scritte in c++) però la funzione in questione dovrei farla in C quindi è un vettore di char!

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Originariamente inviato da WalterP
    il file è c++ (per esigenze di librerie esterne scritte in c++) però la funzione in questione dovrei farla in C quindi è un vettore di char!
    E questo dovevi dirlo prima perché MItaly (giustamente) ti ha dato un suggerimento in C++ ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    165
    facendo una semplificazione della procedura ottengo un codice di questo tipo:

    codice:
    int main(int argc, char* argv[])
    {
    ...
    ...
    char* stringa;
    stringa=concatena_stringa(gesto);
    printf("stringa fuori=%s\n", stringa);
    DOMText*    coordElem = doc->createTextNode(X(stringa)); //scrive la stringa in un file XML
    ...
    ...
    }
    
    
    char* DOMWriter::concatena_stringa(Gesture gesto)
    {
    int intero=10;
    char *stringa;
    char num[100];
    int c;
    
    c=sprintf( num, "%i", intero );
    
    stringa= num;
    printf("stringa=%s\n", stringa);
    
    return stringa;
    }
    in effetti il risultato mostrato è:
    codice:
    stringa=10 
    stringa fuori=10
    però quando vado ad aprire il file XML al posto di 10 ci sono solo caratteri strani!
    La funzione richiamata nel main per scrivere il file XML in realtà funziona perchè se al posto della chiamata "concatena_stringa" scrivo
    codice:
    stringa="10";
    in effetti nel file XML mi compare "10" !!
    Probabilmente nella procedura "concatena_stringa" faccio qualcosa di strano che inserisce nella stringa qualche carattere non supportato dalla funzione che scrive nell'XML!

    Avete qualche idea in merito?
    Grazie!

  8. #8
    Stai restituendo un puntatore ad un array locale (stringa), che ovviamente cessa di esistere nel momento in cui la funzione ritorna.
    Possibilità:
    - usi l'allocazione dinamica (e a quel punto il chiamante si deve ricordare di deallocare);
    - ti fai passare dal chiamante il buffer in cui mettere la stringa;
    - la smetti di scrivere in un orribile misto di C e C++ e usi le stringhe "vere" C++ (std::string), che si smazzano da sole la gestione della memoria.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Originariamente inviato da MItaly

    - la smetti di scrivere in un orribile misto di C e C++ e usi le stringhe "vere" C++ (std::string), che si smazzano da sole la gestione della memoria.
    Penso sia la soluzione migliore ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Originariamente inviato da oregon
    Penso sia la soluzione migliore ...
    ... anche perché lavorare con i char * allocati sull'heap in C++ è un problemone in termini di exception safety (a meno di non wrapparli in uno smart pointer, ma a quel punto fai prima ad usare std::string )
    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.