Newsgroup: it.comp.lang.c++
Titolo: Integer in stringa

Se io ho dichiarato una stringa come array di caratteri:
char stringa[10];
ed ho un numero intero:
int numero = 10;
come faccio ad inserire il numero all'interno della stringa in una certa
posizione? Per esempio, se io voglio inserire numero in modo che l'uno di 10
si trovi nell'elemento 2 dell'array stringa come dovrei fare?
Grazie.
Luca Carlon

si trovi nell'elemento 2 dell'array stringa come dovrei fare?
sprintf(stringa, "  %d", numero);
Comunque se usi il C++ invece dei char potresti usare le std::string
(non ho provato a compilare l'esempio ma dovrebbe essere giusto):
#include <sstream>
#include <string>
#include <iostream>
int main(){
    int numero = 10;
    std::ostringstream oss;
    oss << "  " << numero;
    std::string stringa = oss.str();
    std::cout << stringa << std::endl;
    return 0;
}
-- 
Marco Barisione (ICQ 84277092)

 writes:

Quindi l'uno in stringa[2]?  Dipende esattamente da quello che vuoi
fare.  sprintf(stringa, "%4d", numero); setta i primi due elementi a
blank; sprintf(stringa[2], %d, numero); li lascia inalterati.
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Dept. of Physics, Univ. of Padova, Italy          loreti at pd dot infn dot it

 sprintf(stringa, "  %d", numero);
Ma e lo 0 dove va a finire?
Grazie di tutto.
Luca Carlon

 blank; sprintf(stringa[2], %d, numero); li lascia inalterati.
E lo 0? Va a finire in stringa[3]?

 blank; sprintf(stringa[2], %d, numero); li lascia inalterati.
oops...  leggasi stringa+2 al posto di stringa[2].  Scusate.


 ha scritto nel messaggio
news:LYqp8.95848$%g7.30...@twister2.libero.it...

Usando lo std::locale:
#include <locale>
#include <iostream>
int main()
{
   char stringa[10];
   int numero = 10;
   std::locale loc = std::locale();  // il locale globale
   typedef char* iterator;
   typedef std::num_put<char, iterator> num_put;
   const num_put& tostring = std::use_facet<num_put>(loc);
   std::ios_base& state = std::cout; // per la formattazione
   char fill = ' '; // per il padding
   char* end = tostring.put(stringa + 2, state, fill, numero);
   *end = 0; // terminatore
   std::cout << (stringa + 2);
}
Nota che num_put è molto flessibile:
iterator può essere un qualsiasi iteratore, ad esempio
lo puoi usare per formattare un numero dentro qualsiasi container STL
(in particolare in una std::string).
Inoltre std::locale offre anche altre possibilità di personalizazione.
Saluti  Manlio Perillo

Inoltre std::locale offre anche altre possibilitŕ di personalizazione.
Comincio a capire da dove deriva la brutta fama
del C++ di essere un linguaggio pesante e incasinato.
Io stavo per proporre...
   stringa[2] = '0'+numero/10;
   stringa[3] = '0'+numero%10;
che rispetto a sprintf ha il vantaggio di non scrivere
anche l'inutile (e dannoso se si sta facendo un "patching"
in mezzo ad una stringa) NUL finale.
Andrea

 sprintf(stringa, "  %d", numero);
Però in questo modo l'1 va a finire nell'elemento 0 (stringa[0]), non
nell'elemento 2.
Grazie.
Luca Carlon


La tua soluzione va bene se il numero è minore di 100.
Già se ho un numero generico la cosa si complica.
Se poi voglio applicare delle formattazioni particolari....
Non per questo disapprovo la tua soluzione; anche io in un programma
in cui dovevo fare delle conversioni veloci fra numeri esadecimali e stringhe
mi sono scritto delle routine personalizzate ed ottimizzate.
Tuttavia in un altro programma in cui dovevo convertire dei numeri formattati in
modo particolare (non deciso da me) ho usato il locale perchè permetteva una
maggiore
flessibilità.
Non valeva la pena scriversi delle routine 'a mano'.
P.S.
Nel rispondere al messaggio originale ero tentato di scrivere:
In C++:
.....
Tuttavia subito ci ho ripensato:
In C++ lo puoi scrivere come vuoi:
a mano, usando sprintf, usando num_put, in assembler....
L'importante è sapere ad ogni occasione quale è l'approccio adatto
al problema.
Saluti  Manlio Perillo

nell'elemento 2.
No, va a finire il stringa[2]. Prima di %d ci sono 2 spazi.


 No, va a finire il stringa[2]. Prima di %d ci sono 2 spazi.
aahhh, č cosě che funziona. Non li avevo notati, comunque forse nel mio caso
č meglio come ha suggerito Maurizio, visto che non modifico i primi
elementi, cosě invece pongo due spazi. Invece per quello a cui mi serve
prima del numero ci sono caratteri che mi servono. Grazie cmq per tutti i
consigli.
Luca Carlon

al problema.
Esatto. Vedo che siamo in sintonia.
Solo che io sono convinto che per scrivere "10" a partire
dal terzo carattere di una stringa scomodare la localizzazione
non sia l'approccio adatto.
E sono anche convinto che tirare fuori quella roba con un
principiante sia totalmente insensato.
Andrea


Probabilmente hai ragione, ma fino ad un certo punto.
num_put fa parte della libreria standard, cosi come vector e tutta la
STL, non vedo quindi perchè non consigliarlo.
Saluti  Manlio Perillo