2011-01-18 10 views
5

Ho uno std :: string: 01001, voglio ottenere ogni numero:parte std :: stringa in numero intero

std::string foo = "01001"; 
for (int i=0; i < foo.size(); ++i) 
{ 
    int res = atoi(foo[i]); // fail 
    int res = atoi(&foo[i]); // ok, but res = 0 in any case 
} 

come fare?

risposta

9

Questo è il modo più semplice che vedo:

std::string foo = "01001"; 
for (int i=0; i < foo.size(); ++i) 
{ 
    int res = foo[i] - '0'; 
} 
3

Ogni cifra può essere ottenuto semplicemente mediante sottrazione:

int res = foo[i] - '0'; 

atoi prende una stringa alla terminazione Null, non un carattere individuale. L'approccio di sottrazione funziona perché le dieci cifre decimali sono garantite per essere consecutive nel set di caratteri (ovviamente, se esiste la possibilità che nella stringa vi siano caratteri non generati, è necessario eseguire la corretta gestione degli errori).

+0

Come funziona? – Ockonal

6

Se si conosce tutti i caratteri del foo sta cifre, è possibile utilizzare (int) (foo[i] - '0') che sottrae il valore ASCII '0' dal carattere. Funziona per tutte le cifre perché i loro valori ascii sono consecutivi.

Il tuo primo tentativo non riesce perché foo[i] è un singolo char, mentre atoi() prende un cstring. Il tuo secondo tentativo fallisce perché &foo[i] è un riferimento a quel personaggio.

+1

C e C++ richiedono entrambi che i valori utilizzati per rappresentare le cifre decimali siano consecutivi; non dipende strettamente dal set di caratteri. –

0

Un modo semplice, molto vicino a quello che si ha, potrebbe essere quella di inserire il carattere in una stringa predefinito, come ad esempio:

std::string foo = "01001"; 
char str[] = {" "}; 
for (int i=0; i < foo.size(); ++i) 
{ 
    str[0] = foo[i]; 
    int res = atoi(str); 
} 
Problemi correlati