Yanıtlar:
Diğer yanıtlara göre, bu sorun değil:
char c = '5';
int x = c - '0';
Ayrıca, hata kontrolü için önce isdigit (c) 'nin doğru olup olmadığını kontrol etmek isteyebilirsiniz. Harfler için aynısını tamamen taşınabilir bir şekilde yapamayacağınızı unutmayın, örneğin:
char c = 'b';
int x = c - 'a'; // x is now not necessarily 1
Standart, '0' ile '9' arasındaki rakamlar için karakter değerlerinin bitişik olduğunu garanti eder, ancak alfabenin harfleri gibi diğer karakterler için hiçbir garanti vermez.
Şu şekilde '0' çıkarın:
int i = c - '0';
Standart C aralığındaki her basamaklı garanti '0'..'9'(bölümünde önceki basamak birden büyük olan 5.2.1/3bir C99 taslak ). Aynı şey C ++ için de geçerlidir.
Çılgın bir tesadüf eseri, bir karakter dizisini tam sayıya dönüştürmek istiyorsanız , bunu da yapabilirsiniz!
char *num = "1024";
int val = atoi(num); // atoi = ASCII TO Int
valşimdi 1024. Görünüşe göre atoi()iyi ve bu konuda daha önce söylediklerim sadece benim için geçerli (OS X'te (belki (Lisp şakasını buraya ekleyin))). Bunun strtol()yerine, dönüşümü yapmak için daha genel amaçlı bir işlev kullanan , sonraki örnekle kabaca eşleşen bir makro olduğunu duydum :
char *num = "1024";
int val = (int)strtol(num, (char **)NULL, 10); // strtol = STRing TO Long
strtol() şu şekilde çalışır:
long strtol(const char *str, char **endptr, int base);
A'ya dönüşür *strve longona bir taban sayımış gibi basedavranır. **endptrBoş değilse , bulunan ilk rakam olmayan karakteri tutar strtol()(ama bunu kimin umursadığı).
itoa_s().
Char '0' veya int 48'i şu şekilde çıkarın:
char c = '5';
int i = c - '0';
Açıklama: Dahili olarak ASCII değeri ile çalışır . ASCII tablosundan, karakter 5'in ondalık değeri 53 ve 0, 48'dir . Yani 53 - 48 = 5
VEYA
char c = '5';
int i = c - 48; // Because decimal value of char '0' is 48
Bu , herhangi bir sayı karakterinden 48 çıkarırsanız , tamsayıyı otomatik olarak dönüştürdüğü anlamına gelir .
char numeralChar = '4';
int numeral = (int) (numeralChar - '0');
numeralChar - '0'zaten bir tür olduğundan int, oyuncu kadrosuna ihtiyacınız yok. Olmasa bile, oyuncu kadrosuna gerek yok.
Karakter basamağını karşılık gelen tam sayıya dönüştürmek için. Aşağıda gösterildiği gibi yapın:
char c = '8';
int i = c - '0';
Yukarıdaki hesaplamanın arkasındaki mantık, ASCII değerleri ile oynamaktır. Karakter 8'in ASCII değeri 56, karakter 0'ın ASCII değeri 48'dir. 8 tamsayısının ASCII değeri 8'dir.
İki karakter çıkarırsak, ASCII karakterleri arasında çıkarma gerçekleşecektir.
int i = 56 - 48;
i = 8;
ASCII'de yalnızca tek bir karakter 0-9 ise, ASCII sıfır karakterinin değerini ASCII değerinden çıkarmak iyi sonuç verecektir.
Daha büyük sayıları dönüştürmek istiyorsanız, aşağıdakiler yapılacaktır:
char *string = "24";
int value;
int assigned = sscanf(string, "%d", &value);
** durumu kontrol etmeyi unutmayın (yukarıdaki durumda işe yaradıysa 1 olmalıdır).
Paul.
Böyle bir şey yapmam gerektiğinde, istediğim değerlerle bir dizi hazırlarım.
const static int lookup[256] = { -1, ..., 0,1,2,3,4,5,6,7,8,9, .... };
O zaman dönüşüm kolaydır
int digit_to_int( unsigned char c ) { return lookup[ static_cast<int>(c) ]; }
Bu temelde ctype kitaplığının birçok uygulaması tarafından benimsenen yaklaşımdır. Bunu onaltılık rakamlarla da çalışmak için önemsiz bir şekilde uyarlayabilirsiniz.
Sadece şu atol()işlevi kullanın :
#include <stdio.h>
#include <stdlib.h>
int main()
{
const char *c = "5";
int d = atol(c);
printf("%d\n", d);
}
Senin basamaklı ise, diyelim ki, '5'ASCII, ikili sayı olarak temsil edilir 0011 0101(53). Her rakam en yüksek dört bite sahiptir 0011ve en düşük 4 bit, bcd'deki rakamı temsil eder. Yani sadece yapıyorsun
char cdig = '5';
int dig = cdig & 0xf; // dig contains the number 5
en düşük 4 biti veya aynı olan rakamı elde etmek için. Asm'de (diğer cevaplarda olduğu gibi) andyerine işlemi kullanır sub.
'5'is 53 ( 00110101)
Burada, karakterdeki rakamı int'e ve bunun tersi yönde dönüştürmeye izin veren yardımcı işlevler:
int toInt(char c) {
return c - '0';
}
char toChar(int i) {
return i + '0';
}
işlev kullanın: diziden tamsayıya atoi, diziden float türüne atof; veya
char c = '5';
int b = c - 48;
printf("%d", b);