Risposte:
Come per altre risposte, va bene:
char c = '5';
int x = c - '0';
Inoltre, per il controllo degli errori, potresti voler controllare prima che isdigit (c) sia vero. Nota che non puoi fare lo stesso in modo completamente portabile per le lettere, ad esempio:
char c = 'b';
int x = c - 'a'; // x is now not necessarily 1
Lo standard garantisce che i valori dei caratteri per le cifre da "0" a "9" siano contigui, ma non garantisce per altri caratteri come le lettere dell'alfabeto.
Sottrai "0" in questo modo:
int i = c - '0';
Lo standard C garantisce che ogni cifra nell'intervallo '0'..'9'sia maggiore di una cifra rispetto alla cifra precedente (nella sezione 5.2.1/3della bozza C99 ). Lo stesso vale per C ++.
Se, per qualche folle coincidenza, vuoi convertire una stringa di caratteri in un intero, puoi farlo anche tu!
char *num = "1024";
int val = atoi(num); // atoi = ASCII TO Int
valora è 1024. Apparentemente atoi()va bene, e quello che ho detto prima vale solo per me (su OS X (forse (inserire la battuta Lisp qui))). Ho sentito che è una macro che mappa approssimativamente al prossimo esempio, che utilizza strtol(), invece, una funzione più generica per eseguire la conversione:
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);
Si converte *strin a long, trattandolo come se fosse un basenumero base . Se **endptrnon è nullo, contiene il primo carattere non numerico strtol()trovato (ma a chi importa).
itoa_s().
Sottrai char '0' o int 48 in questo modo:
char c = '5';
int i = c - '0';
Spiegazione: Internamente funziona con il valore ASCII . Dalla tabella ASCII, il valore decimale del carattere 5 è 53 e 0 è 48 . Quindi 53-48 = 5
O
char c = '5';
int i = c - 48; // Because decimal value of char '0' is 48
Ciò significa che se deduci 48 da qualsiasi carattere numerico, convertirà automaticamente il numero intero.
char numeralChar = '4';
int numeral = (int) (numeralChar - '0');
numeralChar - '0'è già di tipo int, quindi non hai bisogno del cast. Anche se non lo fosse, il cast non è necessario.
Per convertire la cifra del carattere nel numero intero corrispondente. Fai come mostrato di seguito:
char c = '8';
int i = c - '0';
La logica alla base del calcolo di cui sopra è giocare con i valori ASCII. Il valore ASCII del carattere 8 è 56, il valore ASCII del carattere 0 è 48. Il valore ASCII dell'intero 8 è 8.
Se sottraiamo due caratteri, la sottrazione avverrà tra ASCII di caratteri.
int i = 56 - 48;
i = 8;
Se è solo un singolo carattere 0-9 in ASCII, la sottrazione del valore del carattere zero ASCII dal valore ASCII dovrebbe funzionare correttamente.
Se vuoi convertire numeri più grandi, allora farà quanto segue:
char *string = "24";
int value;
int assigned = sscanf(string, "%d", &value);
** non dimenticare di controllare lo stato (che dovrebbe essere 1 se ha funzionato nel caso precedente).
Paolo.
Quando ho bisogno di fare qualcosa del genere, preparo un array con i valori che desidero.
const static int lookup[256] = { -1, ..., 0,1,2,3,4,5,6,7,8,9, .... };
Quindi 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 banalmente adattarlo per funzionare anche con cifre esadecimali.
Usa la atol()funzione:
#include <stdio.h>
#include <stdlib.h>
int main()
{
const char *c = "5";
int d = atol(c);
printf("%d\n", d);
}
Se la tua cifra è, diciamo, '5'in ASCII, è rappresentata come numero binario 0011 0101(53). Ogni cifra ha i quattro bit più alti 0011e i 4 bit più bassi rappresentano la cifra in bcd. Quindi fallo e basta
char cdig = '5';
int dig = cdig & 0xf; // dig contains the number 5
per ottenere i 4 bit più bassi o, cosa è uguale, la cifra. In asm, usa andoperation invece di sub(come nelle altre risposte).
'5'è 53 ( 00110101)
Ecco le funzioni di supporto che consentono di convertire digit in char in int e viceversa:
int toInt(char c) {
return c - '0';
}
char toChar(int i) {
return i + '0';
}
usa la funzione: atoi per array su intero, atof per array su float tipo; o
char c = '5';
int b = c - 48;
printf("%d", b);