Bagaimana cara mengonversi a char
ke int
dalam C dan C ++?
c
dan c++
, saya pikir jawaban yang bertentangan dengan kedua bahasa itu masuk akal.
char
arti sebenarnya.
Bagaimana cara mengonversi a char
ke int
dalam C dan C ++?
c
dan c++
, saya pikir jawaban yang bertentangan dengan kedua bahasa itu masuk akal.
char
arti sebenarnya.
Jawaban:
Tergantung pada apa yang ingin Anda lakukan:
untuk membaca nilai sebagai kode ascii, Anda dapat menulis
char a = 'a';
int ia = (int)a;
/* note that the int cast is not necessary -- int ia = a would suffice */
untuk mengkonversi karakter '0' -> 0
, '1' -> 1
, dll, Anda dapat menulis
char a = '4';
int ia = a - '0';
/* check here if ia is bounded by 0 and 9 */
Penjelasan :
a - '0'
sama dengan ((int)a) - ((int)'0')
, yang berarti nilai-nilai ascii karakter dikurangi satu sama lain. Karena 0
datang langsung sebelum 1
di tabel ascii (dan seterusnya sampai 9
), perbedaan antara keduanya memberikan angka yang a
mewakili karakter .
&
-> -10), dan itu memberi Anda angka yang lebih besar dari 10 (seperti x
-> 26)
'1'
memberikan nomor ascii yang tidak 1
, Anda perlu menghapus offset '0'
untuk menyetel kembali untuk menghitungnya mulai 0-9. Angka berturut-turut 1-9 berdekatan dalam angka integer ascii.
Nah, dalam kode ASCII, angka (digit) mulai dari 48 . Yang perlu Anda lakukan adalah:
int x = (int)character - 48;
'0'
C dan C ++ selalu mempromosikan tipe setidaknya int
. Selanjutnya literal karakter bertipe int
C dan char
C ++.
Anda dapat mengonversi char
jenis hanya dengan menetapkan ke int
.
char c = 'a'; // narrowing on C
int a = c;
operator+()
untuk tujuan ini.
int a = c;
) ini akan menyimpan nilai negatif apa pun, yang tidak bisa ditangani oleh fungsi pustaka standar C. Fungsi pustaka standar C menetapkan standar untuk artinya menangani char
nilai sebagai int
.
char hanyalah integer 1 byte. Tidak ada yang ajaib dengan tipe char! Sama seperti Anda dapat menetapkan pendek ke int, atau int untuk panjang, Anda dapat menetapkan char ke int.
Ya, nama tipe data primitif adalah "char", yang menyiratkan bahwa itu hanya boleh berisi karakter. Namun pada kenyataannya, "char" hanyalah pilihan nama yang buruk untuk membingungkan semua orang yang mencoba untuk belajar bahasa. Nama yang lebih baik untuk itu adalah int8_t, dan Anda dapat menggunakan nama itu, jika kompiler Anda mengikuti standar C terbaru.
Meskipun tentu saja Anda harus menggunakan tipe char saat melakukan penanganan string, karena indeks tabel ASCII klasik cocok dalam 1 byte. Namun Anda bisa melakukan penanganan string dengan int reguler juga, meskipun tidak ada alasan praktis di dunia nyata mengapa Anda ingin melakukannya. Misalnya, kode berikut akan berfungsi dengan sempurna:
int str[] = {'h', 'e', 'l', 'l', 'o', '\0' };
for(i=0; i<6; i++)
{
printf("%c", str[i]);
}
Anda harus menyadari bahwa karakter dan string hanyalah angka, seperti yang lainnya di komputer. Ketika Anda menulis 'a' dalam kode sumber, kode itu sudah diproses lebih dulu ke angka 97, yang merupakan konstanta bilangan bulat.
Jadi, jika Anda menulis ekspresi seperti
char ch = '5';
ch = ch - '0';
ini sebenarnya setara dengan
char ch = (int)53;
ch = ch - (int)48;
yang kemudian melalui promosi integer bahasa C
ch = (int)ch - (int)48;
dan kemudian dipotong ke arang agar sesuai dengan tipe hasil
ch = (char)( (int)ch - (int)48 );
Ada banyak hal halus seperti ini terjadi di antara garis, di mana char secara implisit diperlakukan sebagai int.
ascii
, Anda tidak boleh mengasumsikan penyandian khusus apa pun. Pengaturan char
sama dengan int8_t
salah karena itu kemungkinan bisa sama uint8_t
atau uint24_t
.
char
selalu 1 byte dan jika jenis int8_t
/ uint8_t
ada pada sistem yang diberikan (yang sangat mungkin), mereka akan dapat cocok dengan hasil dari char
, karena itu akan menjadi 8 bit. Pada sistem yang sangat eksotis seperti berbagai DSP usang, char
akan ada 16 bit dan uint8_t
tidak akan ada. Menulis kode untuk kompatibilitas dengan DSP usang adalah omong kosong, seperti menulis untuk kompatibilitas dengan komplemen seseorang atau sistem sign & magnitude. Buang-buang waktu, karena sistem seperti itu nyaris tidak ada di dunia nyata.
(Jawaban ini membahas sisi C ++, tetapi masalah ekstensi tanda ada di C juga.)
Penanganan ketiga char
jenis ( signed
, unsigned
, dan char
) lebih halus daripada pertama kali muncul. Nilai dalam kisaran 0 hingga SCHAR_MAX
(yaitu 127 untuk 8-bit char
) mudah:
char c = somevalue;
signed char sc = c;
unsigned char uc = c;
int n = c;
Tetapi, ketika somevalue
berada di luar rentang itu, hanya melalui unsigned char
memberi Anda hasil yang konsisten untuk nilai-nilai "sama" char
di ketiga jenis:
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.
Ini penting ketika menggunakan fungsi dari ctype.h , seperti isupper
atau toupper
, karena ekstensi tanda:
char c = negative_char; // Assuming CHAR_MIN < 0.
int n = c;
bool b = isupper(n); // Undefined behavior.
Perhatikan bahwa konversi melalui int adalah implisit; ini memiliki UB yang sama:
char c = negative_char;
bool b = isupper(c);
Untuk memperbaiki ini, masuk melalui unsigned char
, yang mudah dilakukan dengan pembungkus ctype.h fungsi melalui safe_ctype :
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.
Ini berfungsi karena setiap fungsi yang mengambil salah satu dari ketiga tipe char juga dapat mengambil dua tipe char lainnya. Ini mengarah ke dua fungsi yang dapat menangani salah satu jenis:
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)
selalu memberi Anda nilai non-negatif - bahkan ketika melewati negatif char
atau negatif signed char
- dan chr
mengambil nilai apa pun ord
menghasilkan dan memberikan kembali yang sama persis char
.
Dalam prakteknya, saya mungkin hanya akan melemparkan unsigned char
alih-alih menggunakan ini, tetapi mereka membungkus gips secara ringkas, menyediakan tempat yang nyaman untuk menambahkan pengecekan kesalahan untuk int
-to- char
, dan akan lebih pendek dan lebih jelas ketika Anda perlu menggunakannya beberapa kali dalam jarak dekat.
Gunakan static_cast<int>
:
int num = static_cast<int>(letter); // if letter='a', num=97
Sunting: Anda mungkin harus mencoba menghindari penggunaan(int)
int num = (int) surat;
lihat mengapa menggunakan static_cast <int> (x) bukan (int) x? untuk info lebih lanjut.
Itu semacam tergantung pada apa yang Anda maksud dengan "mengkonversi".
Jika Anda memiliki serangkaian karakter yang mewakili integer, seperti "123456", maka ada dua cara khas untuk melakukannya di C: Gunakan konversi tujuan khusus seperti atoi () atau strtol () , atau sscanf tujuan umum () . C ++ (yang benar-benar bahasa yang berbeda menyamar sebagai peningkatan) menambahkan stringstreams ketiga.
Jika Anda ingin pola bit yang tepat di salah satu int
variabel Anda diperlakukan sebagai char
, itu lebih mudah. Dalam C tipe integer yang berbeda benar-benar lebih merupakan keadaan pikiran daripada "tipe" yang terpisah. Hanya mulai menggunakannya char
di mana diminta, dan Anda harus baik-baik saja. Anda mungkin perlu konversi eksplisit untuk membuat kompilator berhenti merengek pada kesempatan, tetapi semua yang harus dilakukan adalah menjatuhkan bit tambahan melewati 256.
Saya benar-benar memiliki null
keterampilan dalam C, tetapi untuk penguraian sederhana:
char* something = "123456";
int number = parseInt(something);
... ini bekerja untuk saya:
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;
}
Mungkin Anda menginginkan konversi ini untuk menggunakan fungsi-fungsi dari pustaka standar C.
Dalam hal ini, lakukan (sintaks C ++)
typedef unsigned char UChar;
char myCppFunc( char c )
{
return char( someCFunc( UChar( c ) ) );
}
Ekspresi UChar( c )
dikonversi ke unsigned char
untuk menghilangkan nilai-nilai negatif, yang, kecuali untuk EOF, tidak didukung oleh fungsi C.
Kemudian hasil dari ungkapan itu digunakan sebagai argumen aktual untuk int
argumen formal. Di mana Anda mendapatkan promosi otomatis int
. Anda dapat juga menulis langkah terakhir secara eksplisit, seperti int( UChar( c ) )
, tetapi secara pribadi saya menemukan itu terlalu bertele-tele.
Ceria & hth.,
Saya mengalami masalah dalam mengubah array char seperti "7c7c7d7d7d7d7c7c7c7d7d7d7d7c7c7c7c7c7c7d7d7c7c7c7c7d7c7d7d7d7c7c2e2e2e"
menjadi nilai integer aktual yang akan dapat diwakili oleh `7C 'sebagai satu nilai heksadesimal. Jadi, setelah mencari bantuan, saya membuat ini, dan berpikir itu akan keren untuk dibagikan.
Ini memisahkan string char menjadi bilangan bulat kanannya, dan mungkin bermanfaat bagi lebih banyak orang daripada hanya saya;)
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;
}
Semoga ini bisa membantu!
int charToint(char a){
char *p = &a;
int k = atoi(p);
return k;
}
Anda dapat menggunakan metode atoi ini untuk mengonversi char ke int. Untuk informasi lebih lanjut, Anda dapat merujuk ke http://www.cplusplus.com/reference/cstdlib/atoi/ ini , http://www.cplusplus.com/reference/string/stoi/ .