PDA

Visualizza la versione completa : [C++] Trasformare due valori in una CString a Int


Alcott
01-02-2007, 18:17
Ciao a tutti.
Spero possiate aiutarmi perchè è tutto il pomeriggio che ho questo problema e non riesco a venirne a capo. Devo trasformare due numeri separati da virgola, da CString in int.
Il mio codice è questo:



...
int campo = 0;
int ber = 0;
CString temp = "79,2"

char* str = (char *) (LPCTSTR) temp; // per fare il cast da CString a char*

Logger::log(L"Prova", temp); //mi stampa 79,2
Logger::log(L"Prova", (CString)str); // mi stampa 7 invece di 79,2

if (str!=NULL && CString(str).Find(L",")>=0)
sscanf(str, "%d,%d", &campo, &ber);

delete[] str;
...


Non è quello il modo di fare il cast da CString a char*?
Volendo, c'è una funzione per passare direttamente da CString ad INT?
Un grazie anticipato :ciauz:

MItaly
01-02-2007, 18:49
Non riesco a capire il perché di tutto quel casino... basta fare così:


CString stringa="79,2";
int campo=0;
int ber=0;
if (stringa.Find(_T(','))
_stscanf(stringa, "%d,%d", &campo, &ber);

Il tuo codice è un gran pasticcio: ti segnalo un paio di errori:


char* str = (char *) (LPCTSTR) temp; // per fare il cast da CString a char*

Poiché con le massime probabilità stai lavorando in Unicode (visto che poi usi L",") un cast di questo genere non si può fare. In questo modo aggiri i warning del compilatore facendo il cast (errato) in più passi, ma questo non toglie che sia errato (dovresti usare una variabile const wchar_t *, o meglio ancora const TCHAR *, per mantenere la portabilità ANSI/UNICODE).

delete[] str;
Il puntatore restituito da CString.operator PCXSTR() (che richiami convertendo la stringa in LPCTSTR, tipo di dati che corrisponde a CString::PCXSTR, ossia const TCHAR *, ossia, in Unicode, const wchar_t *) punta direttamente alla memoria dove l'oggetto CString memorizza i caratteri e non va toccato, se non in lettura.


sscanf
Poiché operi in Unicode la sscanf non va bene (è pensata per lavorare in ANSI); devi usare la swscanf o, meglio la _stscanf, che, come CString, diventa ANSI o Unicode a seconda che sia definita o meno la macro _UNICODE.

Paulin
02-02-2007, 08:29
Originariamente inviato da MItaly

if (stringa.Find(_T(','))
_stscanf(stringa, "%d,%d", &campo, &ber);


if (stringa.Find(_T(',')))
_stscanf(stringa, "%i,%i", &campo, &ber);


Mancava una parentesi

Alcott
02-02-2007, 10:09
Perfetto, credo di aver capito il mio errore. Come avrete capito, mi sono avvicinato da poco al VC++ (sto lavorando su un progetto già iniziato e conoscendo solo C) e non capivo infatti , per esempio, il significato delle L davanti una stringa. A questo punto vi ringrazio per l'aiuto e vi chiedo un altro piccolo favore :D
Sapreste indicarmi un sito dove trovare documentazione su questo argomento e altre piccole cosette sulle differenze tra C e C++?
Grazie ancora a tutti :ciauz:

Loading