Domanda

C'è un modo per convertire un carattere in un numero intero in C?

Ad esempio, da '5' a 5?

È stato utile?

Soluzione

Come per altre risposte, va bene:

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

Inoltre, per il controllo degli errori, potresti voler verificare che isdigit (c) sia vero per primo. 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' sono contigui, ma non fornisce alcuna garanzia per altri caratteri come le lettere dell'alfabeto.

Altri suggerimenti

Sottrai "0" in questo modo:

int i = c - '0';

Lo standard C garantisce che ogni cifra nell'intervallo '0' .. '9' sia una maggiore della sua cifra precedente (nella sezione 5.2.1 / 3 di la bozza C99 ). Lo stesso vale per C ++.

Se, per una folle coincidenza, vuoi convertire una stringa di caratteri in un numero intero, puoi farlo anche tu!

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

val ora è 1024. Apparentemente atoi () va bene, e ciò che ho detto in precedenza si applica solo a me (su OS X (forse (inserire battuta Lisp) Qui))). Ho sentito dire che è una macro che mappa approssimativamente al prossimo esempio, che usa strtol () , una funzione più generica, per fare invece la conversione:

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

strtol () funziona in questo modo:

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

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

Sottrai il carattere '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 si deducono 48 da qualsiasi carattere numerico, verrà convertito automaticamente l'intero.

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

Per convertire la cifra del carattere in numero intero corrispondente. Fai come mostrato di seguito:

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

La logica dietro il calcolo sopra è 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 sottraggiamo due caratteri, si verificherà una sottrazione tra ASCII di caratteri.

int i = 56 - 48;   
i = 8;

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

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 sopra).

Paul.

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 !!!
}

Quando devo fare una cosa del genere preparo un array con i valori che voglio.

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

Quindi la conversione è semplice

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 adattare questo per lavorare anche con cifre esadecimali.

Controlla questo,

char s='A';

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

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

Usa semplicemente la funzione atol () :

#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 il numero binario 0011 0101 (53). Ogni cifra ha i quattro bit 0011 più alti e i 4 bit più bassi rappresentano la cifra in bcd. Quindi basta

char cdig = '5';
int dig = cdig & 0xf; // dig contains the number 5

per ottenere i 4 bit più bassi o, comunque, la cifra. In asm, utilizza l'operazione e anziché sub (come nelle altre risposte).

usa la funzione: atoi per array in numero intero, atof per array in tipo float; o

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

Lo lanceresti in un int (o float o double o in qualsiasi altra cosa tu voglia fare con esso) e lo memorizzeresti in una variabile anoter.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top