2009-09-30 12 views

risposta

15

std::strtoul() è quello. E poi ancora ci sono quelli vecchi come atoi().

+2

tuttavia, atoi non esegue la firma, giusto? Nel CRT di Windows, verrà restituito un errore (ERANGE) in caso di overflow. – Cheeso

+0

Cheeso, sì, per quello che posso dire con "io", è int ;-) –

11

Boost fornisce lexical_cast.

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

In alternativa, è possibile utilizzare uno stringstream (che è fondamentalmente ciò che lexical_cast fa sotto le coperte):

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

E se vuoi l'interpretazione non decimale, vedi anche: http://stackoverflow.com/questions/1070497/c-convert- hex-string-to-signed-integer – Martin

+0

Sono l'unica persona che ama l'inserimento del flusso, ma odia l'estrazione del flusso? Userei le funzioni (come quella di potenziamento, anche se a dire il vero probabilmente userò ancora atoi senza pensare) ogni volta. – Steve314

+0

Sì, l'estrazione del flusso è piuttosto brutta, soprattutto perché non è possibile inizializzare le costanti con esso. È anche un po 'più potente, dato che puoi usare i manipolatori per cambiare la tua base, ecc. – Martin

-3

Come su int atoi (const char * str)?

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

Questo non è affatto un buon suggerimento. Ha chiesto specificamente "unsigned int" e menziona cose come "_ultoa". Il poster sa di atoi(), atol(), ecc. Queste funzioni sono tutte firmate e riconoscono il simbolo -, potrebbero gestire l'overflow, ecc. La risposta corretta è usare funzioni come strtoul. – Armentage

1

sscanf farà quello che vuoi.

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

Ho odiato la famiglia scanf anche di nuovo in C. Non ha mai fatto ciò che volevo che facesse, e la maggior parte delle volte ha causato un bug. Va bene se sai che la stringa corrisponde ai tuoi requisiti - se hai già controllato o estratto con altro codice - ma in tal caso, perché non usare solo atoi o altro? Chiunque usi una funzione della famiglia scanf - beh, ci sono alcuni crimini in cui nessuna punizione può mai essere troppo dura ;-) – Steve314

+0

Che dovrebbe essere "Chiunque usi una funzione della famiglia scanf in C++ - ..." – Steve314

0

Funziona se si va via _atoi64

unsigned long l = _atoi64 (str);