Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di Alcott
    Registrato dal
    Jul 2003
    Messaggi
    154

    [C++] Da CString a Int

    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:

    codice:
    ...
    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

  2. #2
    Non riesco a capire il perché di tutto quel casino... basta fare così:
    codice:
    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:
    codice:
    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).
    codice:
    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.
    codice:
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    286
    Originariamente inviato da MItaly
    codice:
    if (stringa.Find(_T(','))
        _stscanf(stringa, "%d,%d", &campo, &ber);
    codice:
    if (stringa.Find(_T(',')))
        _stscanf(stringa, "%i,%i", &campo, &ber);
    Mancava una parentesi

  4. #4
    Utente di HTML.it L'avatar di Alcott
    Registrato dal
    Jul 2003
    Messaggi
    154
    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
    Sapreste indicarmi un sito dove trovare documentazione su questo argomento e altre piccole cosette sulle differenze tra C e C++?
    Grazie ancora a tutti

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.