2009-03-10 15 views

risposta

69

Come per le altre risposte, questo va bene:

char c = '5'; 
int x = c - '0'; 

Inoltre, per il controllo degli errori, si potrebbe desiderare di controllare isdigit (c) è vera prima. Si noti che non si può completamente portabile fare lo stesso per le lettere, per esempio:

char c = 'b'; 
int x = c - 'a'; // x is now not necessarily 1 

Le garanzie standard che i valori char per le cifre '0' a '9' sono contigui, ma non rilascia alcuna garanzia per altri personaggi come lettere dell'alfabeto.

+0

Funzionerà con EBCDIC o altre codifiche non ASCII? –

+2

@Paul Tomblin: Sì per le cifre e non le lettere, perché, come ho detto nella risposta, le garanzie standard da "0" a "9" sono contigue ma non forniscono tali garanzie per altri caratteri come "a" a "z" . – Chris

+0

char c = 'b'; int x = c - 'a'; allora x sarà 1 solo in ASCII? – Pan

26

Sottrarre '0' simili:

int i = c - '0'; 

Il C standard garantisce ogni cifra nell'intervallo '0'..'9' è maggiore di uno rispetto alla precedente cifra (sezione 5.2.1/3 del C99 draft). Lo stesso vale per C++.

+1

Questa risposta sarebbe meglio se lei ha detto che un char è/già/efficacemente un numero intero, albiet di implementazione definito segno (ad esempio, potrebbe essere con o senza segno), ed è CHAR_BITS lunga. – Arafangion

+0

non ero sicuro sapendo che lo aiuta davvero. ma Chris ha fatto un buon punto con ... non essendo necessariamente contiguo. avrei dovuto dirlo invece. ora ha vinto la gara :) –

+0

Il tuo è meglio perché hai qualificato la tua risposta, però - Chris avrebbe potuto benissimo inventarsi le sue cose. :) – Arafangion

4
char numeralChar = '4'; 
int numeral = (int) (numeralChar - '0'); 
+0

'numeralChar - '0'' è già di tipo' int', quindi non Non ho bisogno del cast. Anche se non lo fosse, il cast non è necessario. –

+0

Huh, si, quello avrebbe costretto, no? Forse Java ha colorato le mie percezioni. O forse mi sto completamente sbagliando e potrebbe persino costringere in Java. :) –

-3

Lo si invierà a un int (o float o double o qualsiasi altra cosa si voglia fare con esso) e lo memorizzerà in una variabile anoter.

+3

Forse non avrei dovuto rispondere a questo ... – SeanJA

-1

Se è solo un singolo carattere 0-9 in ASCII, quindi sottrarre il valore del carattere zero ASCII dal valore ASCII dovrebbe funzionare correttamente.

Se si desidera convertire un numero maggiore allora quanto segue farà:

char *string = "24"; 

int value; 

int assigned = sscanf(string, "%d", &value); 

** non dimenticate di controllare lo stato (che dovrebbe essere 1 se ha funzionato nel caso di cui sopra).

Paul.

0
char chVal = '5'; 
char chIndex; 

if ((chVal >= '0') && (chVal <= '9')) { 

    chIndex = chVal - '0'; 
} 
else 
if ((chVal >= 'a') && (chVal <= 'z')) { 

    chIndex = chVal - 'a'; 
} 
else 
if ((chVal >= 'A') && (chVal <= 'Z')) { 

    chIndex = chVal - 'A'; 
} 
else { 
    chIndex = -1; // Error value !!! 
} 
20

Se, per qualche coincidenza folle, si desidera convertire una stringa di caratteriad un numero intero, si può fare anche questo!

char *num = "1024"; 
int val = atoi(num); // atoi = ASCII TO Int 

val è ora 1024. A quanto pare atoi() va bene, e quello che ho detto su di esso si applica in precedenza solo a me (su OS X (forse (inserire scherzo Lisp qui))). Ho sentito dire che è una macro che mappa grosso modo al prossimo esempio, che utilizza strtol(), una funzione di general-purpose di più, per fare la conversione, invece:

char *num = "1024"; 
int val = (int)strtol(num, (char **)NULL, 10); // strtol = STRing TO Long 

strtol() funziona così:

long strtol(const char *str, char **endptr, int base); 

Converte *str in un long, trattandolo come se fosse un numero di base base. Se **endptr non è nullo, contiene il primo carattere non numerico strtol() trovato (ma a chi importa di questo).

+0

Non ci sono problemi di thread con atoi (non ha dati statici) e non è deprecato. In effetti è funzionalmente equivalente a: #define atoi (x) (int) (strtol ((x), NULL, 10) –

+0

Beh dannazione Le mie manpage sono vecchie –

+4

Il problema con atoi è che usa 0 come " impossibile trovare un numero qui "valore, quindi atoi (" 0 ") e atoi (" uno ") restituiscono entrambi 0. Se ciò non funziona per quello che stai usando, cerca strtol() o sscanf(). –

0

Quando ho bisogno di fare qualcosa di simile, prebake un array con i valori che voglio.

const static int lookup[256] = { -1, ..., 0,1,2,3,4,5,6,7,8,9, .... }; 

Poi la conversione è facile

int digit_to_int(unsigned char c) { return lookup[ static_cast<int>(c) ]; } 

Questo è fondamentalmente l'approccio adottato da molte implementazioni della libreria ctype. Puoi adattarlo banalmente anche a cifre esadecimali.

+0

Sembra estremamente inefficiente per convertire una cifra decimale singola (o ottale). la porzione pertinente della tua tabella di ricerca non si trova nella cache L1, farai un sacco di cicli per attirarla solo per ottenere un valore.Strendentemente, tendo a dubitare che questa sia anche una buona idea se tu " ri convertendo un'intera serie di cifre, ma dovresti misurarlo. Ovviamente è molto più competitivo per l'hex, – dfeuer

0

Check this,

char s='A'; 

int i = (s<='9')?(s-'0'):(s<='F')?((s-'A')+10):((s-'a')+10); 

solo 0,1,2, ...., E, F.

4

Sottrarre char '0' o int 48 simili:

char c = '5'; 
int i = c - '0'; 

O

char c = '5'; 
int i = c - 48; // Because decimal value of char '0' is 48 
-1

funzione dell'uso: atoi per matrice a intero, atof per matrice galleggiare tipo; o

char c = '5'; 
int b = c - 48; 
printf("%d", b); 
+0

Diverse risposte lo hanno già trattato. Questo aggiunge nulla che non coprivano già. – ShadowRanger

0

usa la funzione atol():

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    const char *c = "5"; 
    int d = atol(c); 
    printf("%d\n", d); 

} 
0

Per convertire cifre carattere corrispondente numero intero. Fai come mostrato di seguito:

char c = '8';      
int i = c - '0'; 

La logica dietro il calcolo sopra è quella di giocare con valori ASCII. Il valore ASCII del carattere 8 è 56, il valore ASCII del carattere 0 è 48. Il valore ASCII del numero intero 8 è 8.

Se sottrarre due caratteri, la sottrazione avverrà tra caratteri ASCII.

int i = 56 - 48; 
i = 8; 
Problemi correlati