2009-06-14 20 views

risposta

29

L'approccio più semplice è quello di utilizzare la funzione atoi() trovata in stdlib.h:

CString s = "123"; 
int x = atoi(s); 

Tuttavia, questo non tratta bene con il caso in cui la stringa non contiene un intero valido, nel qual caso si dovrebbe indagare la funzione strtol():

CString s = "12zzz"; // bad integer 
char * p; 
int x = strtol (s, & p, 10); 
if (* p != 0) { 
    // s does not contain an integer 
} 
+4

è inciampato qui perché il compilatore dice: "atoi: impossibile convertire CString in const char *"; poi ho scoperto che la tua risposta non funziona se si tratta di un progetto unicode, _ttoi è migliore come sottolineato da Unagi – Zac

+0

errore C2664: 'atoi': impossibile convertire il parametro 1 da 'CString' a 'const char *' – maamaa

14
CString s; 
int i; 
i = _wtoi(s); // if you use wide charater formats 
i = _atoi(s); // otherwise 
+1

È necessario fare qualcosa con i valori di ritorno di quelle funzioni per questo codice per essere utile. –

+0

Sì, sei ovviamente corretto. – PaV

7

è anche possibile utilizzare il buon vecchio sscanf.

CString s; 
int i; 
int j = _stscanf(s, _T("%d"), &i); 
if (j != 1) 
{ 
    // tranfer didn't work 
} 
-2

è possibile utilizzare la funzione C atoi (in una clausola try/catch perché la conversione non è sempre possibile) ma non c'è nulla nelle classi MFC per farlo meglio.

+0

Benvenuti in StackOverflow. Potresti avere ragione, ma sembra che [sia stato menzionato già nel 2009] (http://stackoverflow.com/a/992775/104223). (Quando si dispone di una reputazione sufficiente, è possibile aggiungere commenti alle risposte esistenti) – Leigh

+3

atoi non genera eccezioni –

2

Il problema con la risposta accettata è che non può segnalare un errore. C'è strtol (STRING TO Long) che può. Fa parte di una famiglia più grande: wcstol (Stringa di caratteri ampia TO Long, ad esempio Unicode), strtoull (A non più lunga lunga, 64 bit +), wcstoull, strtof (TO Float) e wcstof.

6

Una funzione _ttoi in grado di convertire CString in numero intero, sia char esteso che ansi char può funzionare. Di seguito il dettaglio:

CString str = _T("123"); 
int i = _ttoi(str); 
0

Definire in MSDN: https://msdn.microsoft.com/en-us/library/yd5xkb5c.aspx

int atoi(
    const char *str 
); 
int _wtoi(
    const wchar_t *str 
); 
int _atoi_l(
    const char *str, 
    _locale_t locale 
); 
int _wtoi_l(
    const wchar_t *str, 
    _locale_t locale 
); 

CString è stringa wchar_t. Quindi, se si desidera convertire Cstring a int, è possibile utilizzare:

CString s; 
int test = _wtoi(s) 
+0

'CString' dipende dai simboli del preprocessore' _UNICODE' e '_MBCS'. Potrebbe memorizzare una stringa Unicode con codifica UTF-16, una stringa di caratteri DBCS o una stringa ASCII. Suggerire che sarebbe sempre una stringa Unicode è solo sbagliato, mi dispiace. – IInspectable

0

La soluzione canonica è quella di utilizzare la libreria standard C++ per la conversione. A seconda del tipo di reso desiderato, sono disponibili le seguenti funzioni di conversione: std::stoi, std::stol, or std::stoll (o le loro controparti non firmate std::stoul, std::stoull).

L'implementazione è abbastanza semplice:

int ToInt(const CString& str) { 
    return std::stoi({ str.GetString(), static_cast<size_t>(str.GetLength()) }); 
} 

long ToLong(const CString& str) { 
    return std::stol({ str.GetString(), static_cast<size_t>(str.GetLength()) }); 
} 

long long ToLongLong(const CString& str) { 
    return std::stoll({ str.GetString(), static_cast<size_t>(str.GetLength()) }); 
} 

unsigned long ToULong(const CString& str) { 
    return std::stoul({ str.GetString(), static_cast<size_t>(str.GetLength()) }); 
} 

unsigned long long ToULongLong(const CString& str) { 
    return std::stoull({ str.GetString(), static_cast<size_t>(str.GetLength()) }); 
} 

Tutte queste implementazioni segnalare errori tramite eccezioni (std::invalid_argument se nessuna conversione potrebbe essere eseguita, std::out_of_range se il valore convertito sarebbe caduta fuori dal range del tipo di risultato). Costruire il provvisorio std::[w]string può anche lanciare.

Le implementazioni possono essere utilizzate sia per progetti Unicode che per progetti MBCS.

1
CString s="143"; 
int x=atoi(s); 

o

CString s=_T("143"); 
int x=_toti(s); 

atoi funzionerà, se si desidera convertire CString a int.