Existe-t-il un moyen de convertir std::string
à size_t
? Le problème est que size_t
est un type dépendant de la plateforme (alors qu'il est le résultat de sizeof
). Donc, je ne peux pas garantir que la conversion de string
en unsigned long
ou unsigned int
le fera correctement.
EDIT: Un cas simple est:
std::cout<< "Enter the index:";
std::string input;
std::cin >> input;
size_t index=string_to_size_t(input);
//Work with index to do something
Vous pouvez utiliser %zd
comme spécificateur de format dans une approche de type scanf
-.
Ou utilisez un std::stringstream
qui aura une surcharge >>
à size_t
.
vous pouvez utiliser std::stringstream
std::string string = "12345";
std::stringstream sstream(string);
size_t result;
sstream >> result;
std::cout << result << std::endl;
Supposons un instant que size_t
est un typedef à un entier existant , c'est-à-dire la même largeur que unsigned int
, unsigned long
, ou unsigned long long
.
AFAIR, il pourrait être un type distinct (encore plus grand) en ce qui concerne la formulation standard, mais je considère que cela est hautement improbable.
Travailler avec cette hypothèse que size_t
n'est pas plus grand que unsigned long long
, soit stoull ou strtoull avec transtypage ultérieur en size_t
devrait marcher.
De la même hypothèse (size_t
défini en termes de unsigned long
ou unsigned long long
), il y aurait un operator>>
surcharge pour ce type.
#include <sstream>
std::istringstream iss("a");
size_t size;
iss >> size;
En utilisant iss.fail (), vous vérifiez l'échec. Au lieu de ("a"), utilisez la valeur que vous souhaitez convertir.
/**
* @brief Convert const char* to size_t
* @note When there is an error it returns the maximum of size_t
* @param *number: const char*
* @retval size_t
*/
size_t to_size_t(const char *number) {
size_t sizeT;
std::istringstream iss(number);
iss >> sizeT;
if (iss.fail()) {
return std::numeric_limits<size_t>::max();
} else {
return sizeT;
}
}