web-dev-qa-db-fra.com

convertir la chaîne en taille_t

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
15
Humam Helfawi

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.

6
Bathsheba

vous pouvez utiliser std::stringstream

std::string string = "12345";
std::stringstream sstream(string);
size_t result;
sstream >> result;
std::cout << result << std::endl;
11
Yuriy Orlov

Vous pouvez utiliser sscanf avec le %zu spécificateur, qui est pour std::size_t.

sscanf(input.c_str(), "%zu", &index);

Jetez un oeil ici .

Littéralement, je doute qu'il y ait une surcharge operator >> de std::basic_istringstream pour std::size_t. Voir ici .

9
Lingxi

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.

7
DevSolar
#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.

1
selin kamaş
/**
   * @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;
    }
  }
0
Matheus Toniolli