Come convertire un singolo carattere in un int

Ho una stringa di cifre, ad esempio “123456789”, e ho bisogno di estrarne ognuna per usarle in un calcolo. Naturalmente posso accedere a ciascun carattere per indice, ma come posso convertirlo in un int?

Ho esaminato atoi (), ma prende una stringa come argomento. Quindi devo convertire ogni char in una stringa e quindi chiamare atoi su di esso. C’è un modo migliore?

Puoi utilizzare il fatto che le codifiche dei caratteri per le cifre sono tutte in ordine da 48 (per ‘0’) a 57 (per ‘9’). Questo vale per ASCII, UTF-x e praticamente tutte le altre codifiche ( vedere i commenti sotto per ulteriori informazioni su questo ).

Pertanto il valore intero per qualsiasi cifra è la cifra meno ‘0’ (o 48).

char c = '1'; int i = c - '0'; // i is now equal to 1, not '1' 

è anche

 char c = '1'; int i = c - 48; // i is now equal to 1, not '1' 

Tuttavia trovo il primo c - '0' molto più leggibile.

 #define toDigit(c) (c-'0') 

Oppure potresti usare il metodo “corretto”, simile al tuo approccio originale atoi, ma con std :: stringstream. Questo dovrebbe funzionare con i caratteri come input e stringhe. (boost :: lexical_cast è un’altra opzione per una syntax più comoda)

(Atoi è una vecchia funzione C, e in genere è consigliabile utilizzare gli equivalenti C ++ più flessibili e tipicamente possibili laddove ansible: std :: stringstream copre la conversione da e verso le stringhe)

Puoi usare la funzione atoi ()

 #include  #include  int main(int argc, char* argv[]){ int num ; num = atoi(argv[1]); printf("\n%d", num); } 

Le risposte fornite sono grandi se si desidera solo gestire i numeri arabi e stanno lavorando in una codifica in cui questi numeri sono sequenziali e nello stesso posto di ASCII.

Questo è quasi sempre il caso.

Se non lo è, hai bisogno di una libreria adeguata per aiutarti.

Iniziamo con ICU .

  1. Prima converti la stringa di byte in una stringa unicode. (Lasciato come esercizio per il lettore).
  2. Quindi usa uchar.h per esaminare ciascun carattere.
  3. se il personaggio è UBool u_isdigit (UChar32 c)
  4. quindi il valore è int32_t u_charDigitValue ( UChar32 c )

O forse l’ICU ha qualche funzione per farlo per te – non l’ho guardato in dettaglio.

 #include #include using namespace std; void main() { char ch; int x; cin >> ch; x = char (ar[1]); cout << x; } 

Se sei preoccupato per la codifica, puoi sempre utilizzare un’istruzione switch.

Basta fare attenzione con il formato in cui si tengono quei numeri grandi. La dimensione massima per un numero intero in alcuni sistemi è pari a 65.535 (32.767 firmati). Altri sistemi, hai 2.147.483.647 (o 4.294.967.295 non firmati)

Qualche problema con il seguente modo di farlo?

 int CharToInt(const char c) { switch (c) { case '0': return 0; case '1': return 1; case '2': return 2; case '3': return 3; case '4': return 4; case '5': return 5; case '6': return 6; case '7': return 7; case '8': return 8; case '9': return 9; default: return 0; } } 

In questo modo puoi convertire char in int e int in char facilmente:

 int charToInt(char c) { int arr[]={0,1,2,3,4,5,6,7,8,9}; return arr[c-'0']; }