2009-06-14 15 views

Respuesta

29

El enfoque más simple es utilizar la función atoi() encontrado en stdlib.h:

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

Sin embargo, esto no trata bien con el caso en el que la cadena no contiene un entero válido, en cuyo caso se debe investigar la función strtol():

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

tropezó aquí porque el compilador dice: "atoi: no se puede convertir CString a const char *"; entonces descubrí que tu respuesta no funciona si es un proyecto unicode, _ttoi es mejor como lo señala Unagi – Zac

+0

error C2664: 'atoi': no ​​se puede convertir el parámetro 1 de 'CString' a 'const char *' – maamaa

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

Tienes que hacer algo con los valores de retorno de esas funciones para que este código sea útil. –

+0

Sí, por supuesto, es correcto. – PaV

7

también puedes utilizar el buen sscanf de edad.

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

puede usar la función C atoi (en un bloque try/catch porque la conversión no siempre es posible) pero no hay nada en las clases MFC de hacerlo mejor.

+0

Bienvenido a stackoverflow. Puede que tengas razón, pero parece que [ya se mencionó en 2009] (http://stackoverflow.com/a/992775/104223). (Cuando tenga suficiente reputación, puede agregar comentarios a las respuestas existentes) – Leigh

+3

atoi no genera excepciones –

2

El problema con la respuesta aceptada es que no puede indicar una falla. Hay strtol (STRING TO Long) que puede. Es parte de una familia más grande: wcstol (Cadena de caracteres anchos a largo, por ejemplo Unicode), strtoull (A largo sin firmar, 64bits +), wcstoull, strtof (Float TO) y wcstof.

6

Una función _ttoi puede convertir CString en número entero, tanto el carácter de char ancho como el de carácter ansi pueden funcionar. A continuación se muestra los detalles:

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

Definir en 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 cadena es wchar_t. Por lo tanto, si desea convertir cCadena a int, puede utilizar:

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

'CString' depende de los símbolos del preprocesador' _UNICODE' y '_MBCS'. Puede almacenar una cadena Unicode codificada en UTF-16, una cadena de caracteres DBCS o una cadena ASCII. Sugerir que siempre sea una cadena Unicode es simplemente incorrecto, lo siento. – IInspectable

0

La solución canónica es utilizar la biblioteca C++ estándar para la conversión. Según el tipo de devolución deseado, están disponibles las siguientes funciones de conversión: std::stoi, std::stol, or std::stoll (o sus contrapartes sin firmar std::stoul, std::stoull).

La aplicación es bastante sencillo:

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()) }); 
} 

Todas estas implementaciones reportar errores mediante excepciones (std::invalid_argument si no hay conversión podría realizarse, std::out_of_range Si el valor convertido caerían fuera del rango del tipo de resultado) La construcción del temporal std::[w]string también puede arrojar.

Las implementaciones se pueden usar tanto para proyectos Unicode como MBCS.

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

o

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

atoi funcionará, si se desea convertir a CStringint.