atoi
non gestisce i numeri binari, li interpreta semplicemente come numeri decimali grandi. Il tuo problema è che è troppo alto e ottieni un overflow intero perché viene interpretato come numero decimale.
La soluzione sarebbe quella di utilizzare stoi
, stol
o stoll
che ha ottenuto aggiunto al string
in C++ 11. li chiamo come
int i = std::stoi("01000101", nullptr, 2);
- Il valore restituito è il
int
valore convertito.
- Il primo argomento è il
std::string
che si desidera convertire.
- Il secondo è un
size_t *
in cui verrà salvato l'indice del primo carattere non numerico.
- Il terzo è un
int
che corrisponde alla base che sarà utilizzato per la conversione ..
Per informazioni sulle funzioni guardano its cppreference page.
noti che vi sono anche pre C++ 11 funzioni con quasi lo stesso nome, come ad esempio: strtol
rispetto al C++ 11 stol
.
Anche loro lavorano per basi diverse, ma non gestiscono gli errori nello stesso modo (in particolare mancano quando non è possibile eseguire alcuna conversione sulla stringa data, ad esempio provando a convertire "ciao" in una stringa) e probabilmente dovresti preferire le versioni di C++ 11.
a fare il mio punto, passando "Ciao" sia strtol
e il C++ 11 stol
porterebbe a:
strtol
rendimenti 0
e non ti dà un modo per identificarlo come errore,
stol
da C++ 11 genera std::invalid_argument
e indica che qualcosa non va.
Interpretare falsamente qualcosa come "Ciao" come numeri interi potrebbe portare a bug e dovrebbe essere evitato a mio parere.
Ma per completezza anche un collegamento allo its cppreference page.
fonte
2014-05-11 19:35:52
Cosa intendete esattamente con * una stringa di binario *? Qualcosa come "" 10001 "' che devi convertire in '17'? – NPE
Ya, l'ho appena modificato per renderlo un po 'più chiaro – SkippyNBS
'atoi()' considera la stringa di input come decimale; potresti usare 'strtol()' (o uno dei suoi parenti) con '2' come base per ottenere binari. –