Odpowiedzi:
Jak w przypadku innych odpowiedzi, to jest w porządku:
char c = '5';
int x = c - '0';
Ponadto, aby sprawdzić błędy, możesz chcieć najpierw sprawdzić, czy isdigit (c) jest prawdziwe. Zauważ, że nie możesz całkowicie przenosić tego samego dla liter, na przykład:
char c = 'b';
int x = c - 'a'; // x is now not necessarily 1
Standard gwarantuje, że wartości znaków dla cyfr od „0” do „9” są ciągłe, ale nie gwarantuje, że będą stosowane inne znaki, takie jak litery alfabetu.
Odejmij „0” w ten sposób:
int i = c - '0';
C standardowe zapewnia każda cyfra w zakresie '0'..'9'jest większa od poprzedniej cyfry (w przekroju 5.2.1/3w zanurzeniu C99 ). To samo dotyczy C ++.
Jeśli jakimś szalonym zbiegiem okoliczności chcesz przekonwertować ciąg znaków na liczbę całkowitą, też możesz to zrobić!
char *num = "1024";
int val = atoi(num); // atoi = ASCII TO Int
valwynosi teraz 1024. Najwyraźniej atoi()jest w porządku, a to, co powiedziałem o tym wcześniej, dotyczy tylko mnie (na OS X (być może (wstaw żart Lispa tutaj))). Słyszałem, że jest to makro, które mapuje z grubsza do następnego przykładu, który używa strtol()funkcji bardziej ogólnego przeznaczenia, aby wykonać konwersję:
char *num = "1024";
int val = (int)strtol(num, (char **)NULL, 10); // strtol = STRing TO Long
strtol() działa tak:
long strtol(const char *str, char **endptr, int base);
Przekształca *strsię w a long, traktując ją tak, jakby była baseliczbą podstawową . Jeśli **endptrnie jest null, przechowuje pierwszy strtol()znaleziony znak niebędący cyfrą (ale kogo to obchodzi).
itoa_s().
Odejmij znak „0” lub int 48 w ten sposób:
char c = '5';
int i = c - '0';
Objaśnienie: Wewnętrznie działa z wartością ASCII . W tabeli ASCII wartość dziesiętna znaku 5 to 53, a 0 to 48 . Czyli 53 - 48 = 5
LUB
char c = '5';
int i = c - 48; // Because decimal value of char '0' is 48
Oznacza to, że jeśli odejmiesz 48 od dowolnego znaku liczbowego, automatycznie skonwertuje on liczbę całkowitą.
char numeralChar = '4';
int numeral = (int) (numeralChar - '0');
numeralChar - '0'jest już typu int, więc nie potrzebujesz obsady. Nawet gdyby tak nie było, obsada nie jest potrzebna.
Konwersja cyfry znaku na odpowiednią liczbę całkowitą. Zrób, jak pokazano poniżej:
char c = '8';
int i = c - '0';
Logika stojąca za powyższymi obliczeniami polega na zabawie z wartościami ASCII. Wartość ASCII znaku 8 to 56, wartość ASCII znaku 0 to 48. Wartość ASCII liczby całkowitej 8 to 8.
Jeśli odejmiemy dwa znaki, odejmowanie nastąpi między znakami ASCII.
int i = 56 - 48;
i = 8;
Jeśli jest to tylko pojedynczy znak 0-9 w ASCII, odjęcie wartości znaku zerowego ASCII od wartości ASCII powinno działać poprawnie.
Jeśli chcesz przekonwertować większe liczby, wykonaj następujące czynności:
char *string = "24";
int value;
int assigned = sscanf(string, "%d", &value);
** nie zapomnij sprawdzić statusu (który powinien wynosić 1, jeśli zadziałał w powyższym przypadku).
Paweł.
Kiedy muszę zrobić coś takiego, wstępnie wypalam tablicę z wartościami, które chcę.
const static int lookup[256] = { -1, ..., 0,1,2,3,4,5,6,7,8,9, .... };
Wtedy konwersja jest łatwa
int digit_to_int( unsigned char c ) { return lookup[ static_cast<int>(c) ]; }
Jest to w zasadzie podejście przyjęte przez wiele implementacji biblioteki ctype. Możesz to w prosty sposób dostosować do pracy z cyframi szesnastkowymi.
Sprawdź to,
char s='A';
int i = (s<='9')?(s-'0'):(s<='F')?((s-'A')+10):((s-'a')+10);
tylko za 0,1,2, ...., E, F.
Po prostu użyj atol()funkcji:
#include <stdio.h>
#include <stdlib.h>
int main()
{
const char *c = "5";
int d = atol(c);
printf("%d\n", d);
}
Jeśli twoja cyfra jest, powiedzmy, '5'w ASCII, jest reprezentowana jako liczba binarna 0011 0101(53). Każda cyfra ma najwyższe cztery bity, 0011a najniższe 4 bity reprezentują cyfrę w bcd. Więc po prostu to robisz
char cdig = '5';
int dig = cdig & 0xf; // dig contains the number 5
aby uzyskać najniższe 4 bity lub, co to jest, cyfrę. W asm używa andoperacji zamiast sub(jak w innych odpowiedziach).
'5'jest 53 ( 00110101)
Oto funkcje pomocnicze, które pozwalają konwertować cyfry w znakach na int i odwrotnie:
int toInt(char c) {
return c - '0';
}
char toChar(int i) {
return i + '0';
}
użyj funkcji: atoi dla tablicy na liczbę całkowitą, atof dla tablicy na typ zmiennoprzecinkowy; lub
char c = '5';
int b = c - 48;
printf("%d", b);