Czy istnieje sposób przekonwertowania znaku na liczbę całkowitą w C?
Na przykład od '5'
do 5?
c
type-conversion
Pływ
źródło
źródło
Odejmij „0” w ten sposób:
C standardowe zapewnia każda cyfra w zakresie
'0'..'9'
jest większa od poprzedniej cyfry (w przekroju5.2.1/3
w zanurzeniu C99 ). To samo dotyczy C ++.źródło
Jeśli jakimś szalonym zbiegiem okoliczności chcesz przekonwertować ciąg znaków na liczbę całkowitą, też możesz to zrobić!
val
wynosi teraz 1024. Najwyraźniejatoi()
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żywastrtol()
funkcji bardziej ogólnego przeznaczenia, aby wykonać konwersję:strtol()
działa tak:Przekształca
*str
się w along
, traktując ją tak, jakby byłabase
liczbą podstawową . Jeśli**endptr
nie jest null, przechowuje pierwszystrtol()
znaleziony znak niebędący cyfrą (ale kogo to obchodzi).źródło
itoa_s()
.Odejmij znak „0” lub int 48 w ten sposób:
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
Oznacza to, że jeśli odejmiesz 48 od dowolnego znaku liczbowego, automatycznie skonwertuje on liczbę całkowitą.
źródło
źródło
numeralChar - '0'
jest już typuint
, 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:
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.
źródło
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:
** nie zapomnij sprawdzić statusu (który powinien wynosić 1, jeśli zadziałał w powyższym przypadku).
Paweł.
źródło
źródło
Kiedy muszę zrobić coś takiego, wstępnie wypalam tablicę z wartościami, które chcę.
Wtedy konwersja jest łatwa
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.
źródło
Sprawdź to,
tylko za 0,1,2, ...., E, F.
źródło
Po prostu użyj
atol()
funkcji:źródło
Jeśli twoja cyfra jest, powiedzmy,
'5'
w ASCII, jest reprezentowana jako liczba binarna0011 0101
(53). Każda cyfra ma najwyższe cztery bity,0011
a najniższe 4 bity reprezentują cyfrę w bcd. Więc po prostu to robiszaby uzyskać najniższe 4 bity lub, co to jest, cyfrę. W asm używa
and
operacji zamiastsub
(jak w innych odpowiedziach).źródło
'5'
jest 53 (00110101
)Oto funkcje pomocnicze, które pozwalają konwertować cyfry w znakach na int i odwrotnie:
źródło
użyj funkcji: atoi dla tablicy na liczbę całkowitą, atof dla tablicy na typ zmiennoprzecinkowy; lub
źródło
Rzutowałbyś go na int (lub float, double lub cokolwiek innego, co chcesz z nim zrobić) i przechowałbyś w innej zmiennej.
źródło