2009-09-30 11 views

Répondre

15

std::strtoul() est l'un. Et puis encore, il y a les anciens comme atoi().

+2

atoi ne fait pas non signé cependant, non? Dans le Windows CRT, il retournera une erreur (ERANGE) en cas de débordement. – Cheeso

+0

Cheeso, oui, pour ce que je peux dire par le "i", c'est int ;-) –

11

Boost fournit lexical_cast.

#include <boost/lexical_cast.hpp> 
[...] 
unsigned int x = boost::lexical_cast<unsigned int>(strVal); 

Alternativement, vous pouvez utiliser un stringstream (qui est essentiellement ce que lexical_cast-t sous les couvertures):

#include <sstream> 
[...] 
std::stringstream s(strVal); 
unsigned int x; 
s >> x; 
+1

Et si vous voulez une interprétation non décimale, voir aussi: http://stackoverflow.com/questions/1070497/c-convert- hex-string-to-signed-integer – Martin

+0

Suis-je la seule personne qui aime l'insertion de flux, mais déteste l'extraction de flux? J'utiliserais des fonctions (comme celle-là, mais pour être honnête j'utiliserais probablement encore atoi sans réfléchir) à chaque fois. – Steve314

+0

Ouais, l'extraction de flux est assez moche, d'autant plus que vous ne pouvez pas initialiser les constantes avec. Il est également un peu plus puissant, car vous pouvez utiliser des manipulateurs pour changer votre base, etc. – Martin

-3

Que diriez-vous int atoi (const char * str)?

string s("123"); 
unsigned u = (unsigned)atoi(s.c_str()); 
+5

Ce n'est pas une bonne suggestion du tout. Il a spécifiquement demandé "non signé int" et mentionne des choses comme "_ultoa". L'affiche connaît atoi(), atol(), etc. Ces fonctions sont toutes signées et reconnaissent le symbole -, peuvent gérer le débordement, etc. La bonne réponse est d'utiliser des fonctions comme strtoul. – Armentage

1

sscanf fera ce que vous voulez.

char* myString = "123"; // Declare a string (c-style) 
unsigned int myNumber; // a number, where the answer will go. 

sscanf(myString, "%u", &myNumber); // Parse the String into the Number 

printf("The number I got was %u\n", myNumber); // Show the number, hopefully 123 
+0

J'ai détesté la famille scanf même en C. Il n'a jamais fait ce que je voulais faire, et la plupart du temps cela a causé un bug. C'est bon si vous savez que la chaîne correspond à vos exigences - si vous l'avez déjà vérifié ou extrait avec un autre code - mais dans ce cas, pourquoi ne pas simplement utiliser atoi ou autre chose? Toute personne utilisant une fonction scanf-family - eh bien, il y a des crimes où aucune punition ne peut jamais être trop sévère ;-) – Steve314

+0

Cela devrait être "N'importe qui utilisant une fonction scanf-family en C++ - ..." – Steve314

0

Il fonctionne si vous passez par _atoi64

unsigned long l = _atoi64 (str);

Questions connexes