Newsgroup: it.comp.lang.c++
Titolo: Conversione tra stringhe

Scusatemi sono un novello !!!
Devo convertire da una stringa di 10 caratteri "123.........." (.=blank) a
"0000000123"
In pratica: dal campo stringa allineato a sinistra riempito a destra con
spazi devo ottenere un campo stringa del valore numerico allineato a destra
con zero a sinistra !
Come ???
Grazie
Ciao
P.M. (Post Mailed!) Dove posso trovare su internet librerie shareware per C
per manipolazione stringhe, file, ecc... ???

con zero a sinistra !
Devi sicuramente vedere quanti siano i caratteri non-blank
della tua stringa di partenza; cio` fatto, devi copiarli alla
estrema destra del campo di 10, e infine mettere sulla
sinistra il giusto numero di '0'.  Questo sembra l'approccio
piu` semplice.
Non chiarisci in quale rappresentazione siano le tue
"stringhe".  Supporro` che si tratti di array di caratteri
terminati da uno 0 di terminazione (come usava in C);
se usi invece stringhe standard C++, possono essere
piu` semplici altri approcci -- facci sapere.  Supporro`
dunque che la funzione che vuoi scrivere sia:
    void Tatone(char lastringa[11) {
        // trasforma sul-posto lastringa
    }
Nota la dichiarazione di 11 per la lunghezza dell'array,
perche` oltre ai 10 caratteri "veri", avra` lo zero di
terminazione.
Per operare con "stringhe" in questa rappresentazione,
servono le funzioni di base che ottieni con
    #include <string.h>
Per trovare il primo spazio, userai, proprio all'inizio
della funzione:
    char* psp = strchr(lastringa, ' ');
    if(!psp) return;
Questo pone in psp l'indirizzo del primo spazio della
stringa, o 0 se non ve n'e` alcuno; in quest'ultimo
caso, la stringa e` gia` piena di cifre, quindi usciamo.
Se psp!=0, il numero di cifre nella stringa sara`:
    int ncif = psp-lastringa;
e dobbiamo anzitutto spostare questo numero di
caratteri "verso destra" di, come spero sia chiaro,
10-ncif posizioni:
    memmove(lastringa+10-ncif,lastringa,ncif);
la funzione standard memmove garantisce di
operare correttamente anche se le aree di
"sorgente" e "destinazione" si sovrappongono.
Infine, bisognera` riempire di '0' i primi 10-ncif
elementi dell'array lastringa:
    memset(lastringa, '0', 10-ncif);
Voila!  Ecco dunque la funzione in tutta la sua gloria:
[file da chiamare Tatone.cpp o simili]:
    #include <string.h>
    void Tatone(char lastringa[11) {
        // trasforma sul-posto lastringa
        char* psp = strchr(lastringa, ' ');
        if(!psp) return;
        int ncif = psp-lastringa;
        memmove(lastringa+10-ncif,lastringa,ncif);
        memset(lastringa, '0', 10-ncif);
    }
Non scordare di ragionare un attimo sui
casi-limite per verificare di non avere fatto
degli "errori off-by-one" che sono molto
facili da lasciarsi sfuggire!  Supponiamo
ad esempio che ncif=1, solo una cifra.
Con memmove la piazziamo a lastringa+10-1,
cioe` lastringa+9, che e` appunto l'ultimo
carattere prima dello 0 di terminazione, OK;
poi mettiamo 9 cifre '0' all'inizio -- pure OK.
Viceversa supponi che ci siano 9 cifre; le
piazziamo a partire da lastringa+1, cioe` di
uno in avanti, OK; poi mettiamo 1 '0' -- OK.
Alex

>Devo convertire da una stringa di 10 caratteri "123.........." (.=blank) a
"0000 0001 23"
LONG Val = atol("123..");
StringVal[11];
sprintf(StringVal,"%010l",Val);
nota :
"%010l" = converti un long in stringa e riempi di zeri a sinistra fino ad
arrivare a 10 caratteri.
...e il gioco e fatto....
byebyte

 arrivare a 10 caratteri.
Beh, questo e' C e non C++ :-)
e comunque non e' valido.  Devi scrivere "%010ld" o "%010li".
Ah, perche' chi manda suggerimenti visibili a tutto il mondo non si
preoccupa se scrive fanfaluche?
-- 
Maurizio Loreti                      
http://wwwcdf.pd.infn.it/~loreti/mlo.html
Un. of Padova, Dept. of Physics - Padova, Italy          
lor...@padova.infn.it

con zero a sinistra !
Grazie a tutti per i suggerimenti !!!