2009-06-14 6 views

Répondre

29

La plus simple approche consiste à utiliser la fonction atoi() trouvée dans stdlib.h:

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

Toutefois, cela ne traite pas bien le cas où la chaîne ne contient pas un entier valide, auquel cas vous devriez étudier la fonction strtol():

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

est tombé ici parce que le compilateur dit: "atoi: impossible de convertir CString en const char *"; alors j'ai découvert votre réponse ne fonctionne pas si elle est un projet unicode, _ttoi est mieux comme l'a souligné Unagi – Zac

+0

erreur C2664: « atoi »: ne peut pas convertir le paramètre 1 de « CString » à « const char * » – maamaa

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

Vous devez faire quelque chose avec les valeurs de retour de ces fonctions pour que ce code soit utile. –

+0

Oui, vous avez bien sûr raison. – PaV

7

vous pouvez également utiliser un bon vieux sscanf.

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

Vous pouvez utiliser la fonction C atoi (dans un try/clause catch parce que la conversion n'est pas toujours possible) Mais il n'y a rien dans les classes MFC pour le faire mieux.

+0

Bienvenue sur stackoverflow. Vous avez peut-être raison, mais cela ressemble à cela [a déjà été mentionné en 2009] (http://stackoverflow.com/a/992775/104223). (Lorsque vous avez une réputation suffisante, vous pouvez ajouter des commentaires aux réponses existantes) – Leigh

+3

atoi ne déclenche pas d'exceptions –

2

Le problème avec la réponse acceptée est qu'il ne peut pas signaler l'échec. Il y a strtol (STRing TO Long) qui peut. Il fait partie d'une famille plus large: wcstol (Chaîne de caractères large à long, par exemple Unicode), strtoull (TO long non signé, 64bits +), wcstoull, strtof (TO Float) et wcstof.

6

Une fonction _ttoi peut convertir CString en nombre entier, à la fois le char large et le char Ansi peuvent fonctionner. Ci-dessous le détail:

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

Définir dans 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 est une chaîne wchar_t. Donc, si vous voulez convertir CSTRING int, vous pouvez utiliser:

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

'CString' dépend des symboles du préprocesseur' _UNICODE' et '_MBCS'. Il peut stocker une chaîne Unicode encodée en UTF-16, une chaîne de caractères DBCS ou une chaîne ASCII. Suggérer que ce serait toujours une chaîne Unicode est juste faux, désolé. – IInspectable

0

La solution canonique est d'utiliser la bibliothèque standard C++ pour la conversion. En fonction du type de retour souhaité, les fonctions de conversion suivantes sont disponibles: std::stoi, std::stol, or std::stoll (ou leurs homologues non signés std::stoul, std::stoull).

La mise en œuvre est assez simple en avant:

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

Toutes ces implémentations signalent des erreurs par des exceptions (std::invalid_argument si aucune conversion peut être effectuée, std::out_of_range si la valeur convertie tomberait hors de portée du type de résultat). Construire le std::[w]string temporaire peut également jeter.

Les implémentations peuvent être utilisées pour les projets Unicode et MBCS.

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

ou

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

atoi fonctionnera, si vous voulez convertir CString à int.

Questions connexes