Newsgroup: it.comp.lang.c
Titolo: Stringhe C++

Tenuto conto che uso C++ Builder e quindi sono nel newsgroup sbagliato
volevo cmq porre un quesito a qualke anima buona, visto che in altri ng nn
ho avuto risposta!
Il mio problema ш il seguente io ho una stringa di caratteri contenuta in
una variabile e io vorrei leggermi questa stringa un carattere alla volta e
metterlo in un array di modo che possa gestire singolarmente ogni carattere
a seconda della posizione in cui si trovava sulla stringa!
Aiutatemi....
vi ringrazio in anticipo...
--
ЄКА`АКЄј,ИИ,јЄКА`АКЄј,ИИ,јЄКА`АКЄј,ИИ,јЄКА`АКЄј
Nico
Life would be much easier if I had the source code.
ЄКА`АКЄј,ИИ,јЄКА`АКЄј,ИИ,јЄКА`АКЄј,ИИ,јЄКА`АКЄј


La questione č piuttosto semplice: non č possibile avere un'intera stringa
memorizzata in una variabile. Quello che si ha č un puntatore alla locazione
di memoria in cui č stato inserito il primo carattere della stringa. Per
accedere ai
caratteri sucessivi al primo č sufficiente accedere alle locazioni
successive.
Questa č la logica del C. Se poi un programmatore C++ ha sviluppato una
classe per la quale non esiste un operatore che converta l'oggetto stringa
nel puntatore corrispondente, ti consiglio di cambiare libreria o di
implementare tu stesso la
classe... quel programmatore non merita fiducia.
Riz.

 a seconda della posizione in cui si trovava sulla stringa!
Non capisco bene il perche tu voglia "travasare" quello che il tuo char*
punta in array considerato che puoi scorrere la stringa puntata esattamente
come se stessi lavorando con un array.
Bob Rock


 come se stessi lavorando con un array.
Ma infatti ш proprio quello che nn so fare, come faccio a scorrere la
stringa :-(
Insomma ti faccio un esempio pratico, l'untente in una EditBox inserisce
"2748378748" e il programma tenuto conto della posizione deve moltiplicare i
numeri per cose differenti, ad esempio 2 * a, 7*b, 4*c...ecc asseconda della
posizione in cui si trovano questi num! Non so se mi sono spiegato bene!
Cmq grazie!


Orka, tu stai parlando di C++ Builder... se non ricordo male sta specie di
compilatore utilizza delle cose (oggetti) di nome Ansistring...
Yes... Allora a proposito dell'editbox: supponiamo che l'editbox si chiama
"editbox" (che fantasia), per accedere alla stringa C dell'editbox, basta che
fai:
char* text = editbox->Text.c_str();
Conoscendo di fama la qualitр del C++ builder (e di tutti i compilatori della
borland) avrai qualche memory leak (sicuramente)....
NetSecurity_ ha scritto:


 > > >



Forse non ho capito niente ma se tu scrivi text[0] accedi al primo
carattere....text[1] al secondo...et simila!!!
Volevi mica questo?
Boh

GRAZIE del prezioso aiuto, finalmente sono riuscito a fare quello che
volevo!
grazie a tutti!
nico

 char* text = editbox->Text.c_str();

Ma questa nn è una semplice istruzione di assegnazione, ovvero
prende il

contenuto della Edit e lo mette in una variabile, giusto?


NO: 
text
 è un puntatore a 
char
 che viene
fatto puntare alla stringa contenuta nell'editbox:

        l'Ansistring del builder
è semplicemente un wrapper sul 
char*
 C,

        che è il modo con
cui vengono implementate le stringhe in C: in C una stringa non è
altro che

        un array di caratteri, cioè
un vettore di caratteri,

        scrivere:

           
char str[5] = "ciao";


        è equivalente a scrivere:

           
char str[5] = {'c','i','a','o','\0'};


        come vedi la seconda forma
mostra bene quanto una stringa C è un array (vettore) di caratteri.
il Builder

        come molti compilatori C++
ha la mania di creare oggetti sulle cose più stupide, quindi anche
le

        stringhe, l'oggetto AnsiString
non è altro che un qualcosa del genere:

        class AnsiString


        {


           
...


           
private:


               
...


               
char* text;


               
...


           
public:


               
...


               
char* c_str(void)


               
{


                   
return text;


               
}


               
...


           
...


        };


 

        Ciò che fa la funzione

c_str()
 della classe 
AnsiString
 è tornarti un
puntatore alla stringa 
text


        che è incapsulata
nell'oggetto 
AnsiString,
quindi quando fai 
AnsiString S = "Ciao"
;

        e poi fai 
char* text
= S.c_str();


        non fai altro che fare riferimento
comunque alla stessa zona di memoria, solo che l'
AnsiString
 crea
anche tante

        altre schifezze...

        una volta che hai il 
char*
,
puoi utilizzare tutte le funzioni C che vuoi per fare lo scan dell'array,
ad es.

        unsigned short int index
= 0;


        for(unsigned short int
i=0;i < strlen(text);)


        {


           
char* dummy = new char[strlen(text) + 1];


           
strcpy(dummy,&text[i]);


           
if(strchr(dummy,' ')) *strchr(dummy,' ') = 0x00;


           
i += strlen(dummy);


           
int value = 0L;


           
sscanf(dummy,"%d",&value);


           
fprintf(stderr,"[%02d] Value %d\n",index++,value);


           
delete[] dummy;


        }


        //L'ho fatto sul momento,
quindi forse ci ho sbattuto dentro qualche cazzata...


        Non conosco il builder, però
in ogni caso ti consiglieri di controllare l'help, magari il builder

        ti da qualche funzione per
gestire le 
AnsiString
 senza passare dal 
char*
, visto
che sei in una

        sporca situazione di luridi
oggetti, forse è meglio continuare a navigare nella schifezza...

Byezzzzzzzz