Nasıl C ve C ++ 'da char
bir dönüştürebilirim int
?
c
ve c++
bence her iki dilin karşı karşıya olduğu cevaplar makul.
char
.
Nasıl C ve C ++ 'da char
bir dönüştürebilirim int
?
c
ve c++
bence her iki dilin karşı karşıya olduğu cevaplar makul.
char
.
Yanıtlar:
Ne yapmak istediğine bağlı:
değeri bir ascii kodu olarak okumak için,
char a = 'a';
int ia = (int)a;
/* note that the int cast is not necessary -- int ia = a would suffice */
karakteri dönüştürmek '0' -> 0
, '1' -> 1
vb yazabilirsiniz
char a = '4';
int ia = a - '0';
/* check here if ia is bounded by 0 and 9 */
Açıklama :
a - '0'
eşdeğerdir ((int)a) - ((int)'0')
, yani karakterlerin ascii değerleri birbirinden çıkarılır. Yana 0
hemen önce gelir 1
(ve böylece kadar ASCII tablosunda 9
), ikisi arasındaki fark karakteri bu sayısını verir a
temsil eder.
&
-> -10 gibi ) ve 10'dan büyük sayılar verir (örneğin x
-> 26)
'1'
bir ascii numarası sağlarsa , 0-9 arasında saymak için yeniden hizalamak 1
için ofseti kaldırmanız gerekir '0'
. Ardışık 1-9 sayıları ascii tamsayı numarasına bitişiktir.
ASCII kodunda sayılar (rakamlar) 48'den başlar . Tek yapmanız gereken:
int x = (int)character - 48;
'0'
C ve C ++ her zaman en azından türleri destekler int
. Ayrıca karakter değişmezleri int
C ve char
C ++ 'dadır.
Bir char
türü yalnızca bir öğesine atayarak dönüştürebilirsiniz int
.
char c = 'a'; // narrowing on C
int a = c;
operator+()
.
int a = c;
), C standart kitaplık işlevlerinin ele alamadığı negatif değerleri tutacaktır. C standart kütüphane fonksiyonları, char
değerleri işlemenin anlamı için standardı belirler int
.
char sadece 1 baytlık bir tam sayıdır. Char tipinde sihir yok! Bir int'e kısa veya int'e uzun atayabileceğiniz gibi, int'e bir karakter atayabilirsiniz.
Evet, ilkel veri türünün adı "char" olur ve bu yalnızca karakter içermesi gerektiğini ima eder. Ama gerçekte, "char" sadece dili öğrenmeye çalışan herkesi karıştırmak için kötü bir isim seçimidir. Bunun için daha iyi bir isim int8_t'dir ve derleyiciniz en son C standardını takip ediyorsa bu adı kullanabilirsiniz.
Tabii ki bir olsa gerekir dize işleme yaparken, karakter türünü kullandıkları için 1 bayt klasik ASCII tablosu uyan dizini. Sen olabilir Hiç bunu neden istediğini gerçek dünyada pratik neden yoktur rağmen ancak sıra düzenli ints ile dize işleme yapmak. Örneğin, aşağıdaki kod mükemmel şekilde çalışacaktır:
int str[] = {'h', 'e', 'l', 'l', 'o', '\0' };
for(i=0; i<6; i++)
{
printf("%c", str[i]);
}
Karakterlerin ve dizelerin bilgisayardaki diğer her şey gibi sadece sayı olduğunu anlamalısınız. Kaynak kodunda 'a' yazdığınızda, 97 tamsayısı olan bir tamsayı sabiti olarak önceden işlenir.
Yani şöyle bir ifade yazarsanız
char ch = '5';
ch = ch - '0';
bu aslında
char ch = (int)53;
ch = ch - (int)48;
bu da C dili tamsayı tanıtımlarından geçiyor
ch = (int)ch - (int)48;
ve sonuç türüne uyması için bir karaktere kısaltıldı
ch = (char)( (int)ch - (int)48 );
Çizgiler arasında böyle bir çok ince şey var, char dolaylı olarak int olarak değerlendiriliyor.
ascii
, belirli bir kodlama varsaymamanız gerekir. char
Eşit olarak ayarlamak int8_t
yanlıştır, çünkü eşit olabilir uint8_t
ya da olabilir uint24_t
.
char
her zaman 1 bayttır ve verilen sistemdeki türler int8_t
/ uint8_t
varsa (çok olasıdır), a'nın sonucuna uyabileceklerdir char
, çünkü o zaman 8 bit olacaktır. Çeşitli eski DSP'ler gibi oldukça egzotik sistemlerde char
16 bit uint8_t
olacak ve olmayacak. Tamamlanmış DSP'lerle uyumluluk için kod yazmak, tıpkı bir kişinin tamamlayıcısı veya işaret ve büyüklük sistemleri ile uyumluluk için yazmak gibi saçmadır. Bu tür sistemler gerçek dünyada zar zor var olduğundan, büyük zaman kaybı.
(Bu yanıt, nesnelerin C ++ tarafına yöneliktir, ancak işaret uzantısı sorunu C'de de bulunmaktadır.)
Üç char
türün de ( signed
, unsigned
ve char
) kullanılması ilk göründüğünden daha hassastır. 0 ila SCHAR_MAX
(8 bit için 127 olan char
) değerler kolaydır:
char c = somevalue;
signed char sc = c;
unsigned char uc = c;
int n = c;
Ancak, somevalue
bu aralığın dışındayken, yalnızca bu üç türdeki unsigned char
"aynı" char
değerler için tutarlı sonuçlar verir :
char c = somevalue;
signed char sc = c;
unsigned char uc = c;
// Might not be true: int(c) == int(sc) and int(c) == int(uc).
int nc = (unsigned char)c;
int nsc = (unsigned char)sc;
int nuc = (unsigned char)uc;
// Always true: nc == nsc and nc == nuc.
İşaret uzantısı nedeniyle veya gibi ctype.h işlevlerini kullanırken bu önemlidir :isupper
toupper
char c = negative_char; // Assuming CHAR_MIN < 0.
int n = c;
bool b = isupper(n); // Undefined behavior.
İnt üzerinden dönüşümün örtük olduğuna dikkat edin; bu aynı UB'ye sahiptir:
char c = negative_char;
bool b = isupper(c);
Bunu düzeltmek için ctype.h işlevlerini safe_ctype yoluyla unsigned char
sararak kolayca yapılır :
template<int (&F)(int)>
int safe_ctype(unsigned char c) { return F(c); }
//...
char c = CHAR_MIN;
bool b = safe_ctype<isupper>(c); // No UB.
std::string s = "value that may contain negative chars; e.g. user input";
std::transform(s.begin(), s.end(), s.begin(), &safe_ctype<toupper>);
// Must wrap toupper to eliminate UB in this case, you can't cast
// to unsigned char because the function is called inside transform.
Bu çalışır çünkü üç karakter türünden herhangi birini alan herhangi bir işlev diğer iki karakter türünü de alabilir. Herhangi bir türün üstesinden gelebilecek iki işleve yol açar:
int ord(char c) { return (unsigned char)c; }
char chr(int n) {
assert(0 <= n); // Or other error-/sanity-checking.
assert(n <= UCHAR_MAX);
return (unsigned char)n;
}
// Ord and chr are named to match similar functions in other languages
// and libraries.
ord(c)
Bir negatif geçti bile - her zaman negatif olmayan bir değer verir char
veya negatif signed char
- ve chr
herhangi bir değer alır ord
üreten ve arka aynı verir char
.
Uygulamada, muhtemelen unsigned char
bunları kullanmak yerine dökülüyordum , ancak dökümünü kısa bir süre int
sarıyorlar char
, -to- için hata kontrolü eklemek için uygun bir yer sağlıyorlar ve bunları birkaç kez kullanmanız gerektiğinde daha kısa ve daha açık olacaklar yakın.
Kullanım static_cast<int>
:
int num = static_cast<int>(letter); // if letter='a', num=97
Düzenleme: Muhtemelen kullanmaktan kaçınmaya çalışmalısınız(int)
int num = (int) harf;
check out (int) x yerine neden static_cast <int> (x) kullanıyorsunuz? daha fazla bilgi için.
Bu bir tür dönüştürmek ne demek bağlıdır.
"123456" gibi bir tamsayıyı temsil eden bir dizi karakteriniz varsa, bunu C'de yapmanın iki tipik yolu vardır: atoi () veya strtol () veya genel amaçlı sscanf gibi özel amaçlı bir dönüşüm kullanın () . C ++ (gerçekten yükseltme olarak maskeleyen farklı bir dildir) üçüncü bir dize akışı ekler.
int
Değişkenlerinizden birindeki kesin bit deseninin a olarak ele alınmasını istiyorsanız char
, bu daha kolaydır. C'de farklı tamsayı tipleri gerçekte ayrı olan "tiplerden" daha fazla zihinsel durumdur. Sadece char
s'nin istendiği yerde kullanmaya başlayın ve iyi olmalısınız. Derleyicinin arada sırada sızlanmayı bırakmak için açık bir dönüşüme ihtiyacınız olabilir, ancak tek yapmanız gereken 256'dan fazla olan bitleri bırakmaktır.
null
C'de kesinlikle becerilerim var , ancak basit bir ayrıştırma için:
char* something = "123456";
int number = parseInt(something);
... bu benim için çalıştı:
int parseInt(char* chars)
{
int sum = 0;
int len = strlen(chars);
for (int x = 0; x < len; x++)
{
int n = chars[len - (x + 1)] - '0';
sum = sum + powInt(n, x);
}
return sum;
}
int powInt(int x, int y)
{
for (int i = 0; i < y; i++)
{
x *= 10;
}
return x;
}
Muhtemelen bu dönüşümü C standart kitaplığındaki işlevleri kullanmak için istiyorsunuz.
Bu durumda, (C ++ sözdizimi) yapın
typedef unsigned char UChar;
char myCppFunc( char c )
{
return char( someCFunc( UChar( c ) ) );
}
İfade UChar( c )
, unsigned char
EOF hariç, C işlevleri tarafından desteklenmeyen negatif değerlerden kurtulmak için dönüşür .
Daha sonra bu ifadenin sonucu int
resmi bir argüman için gerçek argüman olarak kullanılır . Otomatik promosyonu nereden alacağınız int
. Alternatif olarak bu son adımı açık bir şekilde yazabilirsiniz int( UChar( c ) )
, ama şahsen bunu çok ayrıntılı buluyorum.
Şerefe & h.,
Ben "7c7c7d7d7d7d7c7c7c7d7d7d7d7c7c7c7c7c7c7d7d7c7c7c7c7d7c7d7d7d7c7c2e2e2e"
bir onaltılık değer olarak `` 7C '' ile temsil edilebilir gerçek tamsayı değerine gibi bir char dizi dönüştürme sorunları vardı . Bu yüzden, yardım için gezdikten sonra bunu yarattım ve paylaşmanın harika olacağını düşündüm.
Bu karakter dizesini doğru tamsayılarına ayırır ve benden daha fazla insana yardımcı olabilir;)
unsigned int* char2int(char *a, int len)
{
int i,u;
unsigned int *val = malloc(len*sizeof(unsigned long));
for(i=0,u=0;i<len;i++){
if(i%2==0){
if(a[i] <= 57)
val[u] = (a[i]-50)<<4;
else
val[u] = (a[i]-55)<<4;
}
else{
if(a[i] <= 57)
val[u] += (a[i]-50);
else
val[u] += (a[i]-55);
u++;
}
}
return val;
}
Umarım yardımcı olur!
int charToint(char a){
char *p = &a;
int k = atoi(p);
return k;
}
Char'ı int'e dönüştürmek için bu atoi yöntemini kullanabilirsiniz. Daha fazla bilgi için bu http://www.cplusplus.com/reference/cstdlib/atoi/ , http://www.cplusplus.com/reference/string/stoi/ adresine başvurabilirsiniz .