2014-05-11 12 views
5

Ho una stringa di binario che poi converto in un numero intero utilizzando atoi(). Quando faccio questo sembra convertire automaticamente il binario in decimale. Il problema è che il numero intero risultante è negativo e non è in accordo con nessuno dei convertitori online da binario a decimale. C'è qualcosa di rotto con atoi()? Dovrei invece usare una funzione diversa?Stringa binaria in intero con 'atoi()'

Codice:

string myString = "01000101"; 
int x = atoi(myString.c_str()); 
cout << x; 

Grazie

+0

Cosa intendete esattamente con * una stringa di binario *? Qualcosa come "" 10001 "' che devi convertire in '17'? – NPE

+0

Ya, l'ho appena modificato per renderlo un po 'più chiaro – SkippyNBS

+0

'atoi()' considera la stringa di input come decimale; potresti usare 'strtol()' (o uno dei suoi parenti) con '2' come base per ottenere binari. –

risposta

14

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.

2

Sembra che si dovrebbe utilizzare strtol() con 2 come ultimo argomento.

+0

Poiché questa è la risposta accettata, aggiungerò che penso che le versioni C++ 11 per le conversioni da stringa a interi siano supperenti quando si tratta di gestione degli errori (e 'strtol' non dovrebbe essere usato). Maggiori informazioni in fondo alla mia risposta. –