Comment convertir un objet CString
en nombre entier dans MFC.Conversion de MFC CString en entier
Répondre
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
}
CString s;
int i;
i = _wtoi(s); // if you use wide charater formats
i = _atoi(s); // otherwise
Vous devez faire quelque chose avec les valeurs de retour de ces fonctions pour que ce code soit utile. –
Oui, vous avez bien sûr raison. – PaV
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
}
Si vous utilisez la routine TCHAR.H
(implicitement ou explicitement), assurez-vous d'utiliser _ttoi()
fonction, de sorte qu'il compile pour les deux compilations Unicode et ANSI.
Plus de détails: https://msdn.microsoft.com/en-us/library/yd5xkb5c.aspx
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.
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
atoi ne déclenche pas d'exceptions –
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
.
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);
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)
'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
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.
CString s="143";
int x=atoi(s);
ou
CString s=_T("143");
int x=_toti(s);
atoi
fonctionnera, si vous voulez convertir CString
à int
.
- 1. mfc copier certaines sections d'un CString
- 2. GoogleMock - Matchers et MFC \ ATL CString
- 3. Conversion de nombre entier de lisp en hexadécimal
- 4. . Bogue .NET lors de la conversion de float en entier?
- 5. Comment convertir cstring en NSString?
- 6. Conversion d'un double en entier pour GetHashCode dans Delphi
- 7. Conversion d'un nombre entier en une chaîne hexadécimale dans Ruby
- 8. CString longueur maximale
- 9. erreur Lien CString
- 10. Alternative à CString :: Format?
- 11. Pourquoi ai-je reçu InvalidCastException lors de la conversion de l'objet en entier?
- 12. URL échappant aux chaînes MFC
- 13. conversion de la chaîne yyyyMMdd en type entier n'est pas valide
- 14. caractères d'échappement dans un CString
- 15. priorité de conversion en C++
- 16. flottant à la conversion entier en utilisant l'iPhone SIMD unité flottante
- 17. Conversion d'une chaîne de nombres en entiers
- 18. Conversion de nmake en
- 19. Convertir une chaîne en entier avec décimal en Python
- 20. Lors de la conversion d'un petit type entier en un entier, est-il sûr de s'appuyer sur un masque pour supprimer le signe?
- 21. Convertir booléenne en entier VB.NET
- 22. MFC équivalent au fichier Java # isDirectory()
- 23. Comment marshaler cstring * via P/Invoke?
- 24. CStringList dans MFC
- 25. objet Convertir en entier en PHP
- 26. Création de requêtes SQL pour SQLite avec les primitives MFC
- 27. colordialog conversion en nombre plutôt qu'en chaîne
- 28. MFC CDialog :: Création échoue
- 29. MFC: CToolTipCtrl provoque ASSERT
- 30. Conversion d'un tableau PHP en XML?
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
erreur C2664: « atoi »: ne peut pas convertir le paramètre 1 de « CString » à « const char * » – maamaa