Qu'est-ce que atoi équivalent de 64 bits entier(un uint64_t) en C qui fonctionne sur Unix et Windows?
Je suis en train de convertir 64 bits entier chaîne de caractères en entier, mais je ne sais pas lequel utiliser.
- oui, vous avez raison, bien que les deux sont très similaires. Liées, en face du problème: stackoverflow.com/questions/7348051/...
- Connexes, voir Convertir en chaîne hexadécimale avec les principaux “0x” signé court en C++?
- Double Possible de So nous avons int32_t, int16_t, un uint64_t, etc.. Mais où sont les atoi32, atoi16, atoui64, etc...?
Vous devez vous connecter pour publier un commentaire.
Utilisation
strtoull
si vous l'avez ou_strtoui64()
avec visual studio.sizeof(unsigned long long)
est supérieur ou égal àsizeof(uint64_t)
, mais souvent, ils sont égaux, c'est pourquoi strtoull œuvres._strtoui64()
exiger fichier d'en-têtestdlib.h
Vous avez marqués cette question c++, donc je suis en supposant que vous pourriez être intéressé en C++ solutions de trop. Vous pouvez faire cela en utilisant
boost::lexical_cast
oustd::istringstream
si le boost n'est pas disponible pour vous:Les deux modèles fonctionnent sur Windows et Linux (et d'autres).
En C++11, il ya aussi fonctions qui opèrent sur
std::string
, y comprisstd::stoull
que vous pouvez utiliser:Quelque chose comme...
..alors simplement utiliser
atoll()
. Vous pouvez modifier la#ifdef WINDOWS
à autre chose, il suffit d'utiliser quelque chose que vous pouvez compter sur pour indiquer queatoll()
est absent, maisatoi64()
est là (au moins pour les scénarios que vous êtes inquiet au sujet de).Essayer
strtoull()
, oustrtoul()
. Le premier est seulement en C99 et C++11, mais il est généralement largement disponible.En c++ moderne je voudrais utiliser std::stoll.
http://en.cppreference.com/w/cpp/string/basic_string/stol
Moment de choisir entre les fonctions de style C comme strtoll (qui sont bien sûr facile à utiliser avec des std::string) et std::stoll (qui, à première vue, semble mieux adapté pour les std::string) ou boost::lexical_cast: sachez que les deux derniers lèvera une exception dans le cas où ils ne peuvent pas analyser la chaîne d'entrée ou de la gamme des débordements.
C'est parfois utile, parfois non, cela dépend de ce que vous essayez d'atteindre.
Si vous n'êtes pas dans le contrôle de la chaîne à analyser (comme il est de données externes), mais vous voulez écrire du code robuste (qui doit toujours être votre désir) il faut toujours s'attendre à des données corrompues injecté par certains malveillant ou cassé à l'extérieur de composants. Les données endommagé strtoll ne sera pas le jeter, mais a besoin de plus de code explicite pour détecter toute entrée de données. std::stoll et boost::lexical_cast ne détection automatique et signal de merde d'entrée, mais vous devez assurez-vous d'attraper les exceptions quelque part pour éviter d'être résilié(TM).
Donc choisir l'un ou l'autre en fonction de la structure du code environnant, les besoins de l'analyse des résultats (parfois illégale de données d'être "analysé" dans un 0 est absolument OK) la source des données à analyser et le dernier mais non le moindre de vos préférences personnelles. Aucune des fonctions disponibles est généralement supérieure aux autres.