PDA

Visualizza la versione completa : [C++] Funzione per concatenare in una stringa un vettore di interi


WalterP
06-10-2011, 18:49
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!

MItaly
06-10-2011, 19:35
#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:


#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 "

WalterP
06-10-2011, 19:59
Originariamente inviato da MItaly


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


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



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! :cry:

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

oregon
06-10-2011, 20:11
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?

WalterP
06-10-2011, 20:22
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!

oregon
06-10-2011, 20:24
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++ ...

WalterP
07-10-2011, 13:49
facendo una semplificazione della procedura ottengo un codice di questo tipo:


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 è:

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
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!

MItaly
07-10-2011, 13:58
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.

oregon
07-10-2011, 14:05
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 ...

MItaly
07-10-2011, 16:44
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 :mem: (a meno di non wrapparli in uno smart pointer, ma a quel punto fai prima ad usare std::string :zizi: )

Loading