มีวิธีแปลงอักขระเป็นจำนวนเต็มใน C หรือไม่?
ตัวอย่างเช่นจาก'5'
ถึง 5?
มีวิธีแปลงอักขระเป็นจำนวนเต็มใน C หรือไม่?
ตัวอย่างเช่นจาก'5'
ถึง 5?
คำตอบ:
ตามคำตอบอื่น ๆ สิ่งนี้ใช้ได้:
char c = '5';
int x = c - '0';
นอกจากนี้สำหรับการตรวจสอบข้อผิดพลาดคุณอาจต้องการตรวจสอบ isdigit (c) เป็นจริงก่อน โปรดทราบว่าคุณไม่สามารถเคลื่อนย้ายได้อย่างสมบูรณ์สำหรับตัวอักษรตัวอย่างเช่น:
char c = 'b';
int x = c - 'a'; // x is now not necessarily 1
มาตรฐานรับประกันว่าค่าถ่านสำหรับตัวเลข '0' ถึง '9' นั้นติดกัน แต่ไม่รับประกันสำหรับอักขระอื่น ๆ เช่นตัวอักษรของตัวอักษร
ลบ '0' ดังนี้:
int i = c - '0';
มาตรฐาน C รับประกันว่าแต่ละหลักในช่วง'0'..'9'
นั้นมากกว่าตัวเลขก่อนหน้า (ในส่วน5.2.1/3
ของร่าง C99 ) C ++ ก็เช่นเดียวกัน
ถ้าบังเอิญคุณต้องการแปลงสตริงอักขระเป็นจำนวนเต็มคุณก็ทำได้เช่นกัน!
char *num = "1024";
int val = atoi(num); // atoi = ASCII TO Int
val
ตอนนี้คือ 1024 เห็นได้ชัดว่าปกติatoi()
ดีและสิ่งที่ฉันพูดเกี่ยวกับเรื่องนี้ก่อนหน้านี้ใช้ได้กับฉันเท่านั้น (บน OS X (อาจจะ (แทรกเรื่องตลก Lisp ที่นี่))) ฉันเคยได้ยินมาว่ามันเป็นมาโครที่แมปคร่าวๆกับตัวอย่างถัดไปซึ่งใช้strtol()
ฟังก์ชันที่มีวัตถุประสงค์ทั่วไปมากขึ้นเพื่อทำการแปลงแทน:
char *num = "1024";
int val = (int)strtol(num, (char **)NULL, 10); // strtol = STRing TO Long
strtol()
ทำงานเช่นนี้:
long strtol(const char *str, char **endptr, int base);
มันแปลง*str
เป็น a long
โดยถือว่ามันเป็นbase
เลขฐาน หาก**endptr
ไม่เป็นโมฆะจะมีอักขระที่ไม่ใช่ตัวเลขตัวแรกที่strtol()
พบ (แต่ใครจะสนใจ)
itoa_s()
เลย
เพื่อแปลงตัวเลขของอักขระเป็นจำนวนเต็มที่สอดคล้องกัน ทำตามที่แสดงด้านล่าง:
char c = '8';
int i = c - '0';
ตรรกะเบื้องหลังการคำนวณข้างต้นคือการเล่นกับค่า ASCII ค่า ASCII ของอักขระ 8 คือ 56 ค่า ASCII ของอักขระ 0 คือ 48 ค่า ASCII ของจำนวนเต็ม 8 คือ 8
หากเราลบอักขระสองตัวการลบจะเกิดขึ้นระหว่าง ASCII ของอักขระ
int i = 56 - 48;
i = 8;
ลบถ่าน '0' หรือ int 48 ดังนี้:
char c = '5';
int i = c - '0';
คำอธิบาย: ภายในใช้ได้กับ ค่าASCII จากตาราง ASCII ค่าทศนิยมของตัวละคร5 คือ 53และ0 48 ดังนั้น53-48 = 5
หรือ
char c = '5';
int i = c - 48; // Because decimal value of char '0' is 48
นั่นหมายความว่าถ้าคุณหัก 48ออกจากอักขระตัวเลขใด ๆ ก็จะแปลงจำนวนเต็มโดยอัตโนมัติ
char numeralChar = '4';
int numeral = (int) (numeralChar - '0');
numeralChar - '0'
เป็นประเภทอยู่แล้วint
ดังนั้นคุณไม่จำเป็นต้องมีนักแสดง แม้ว่าจะไม่ใช่ แต่ก็ไม่จำเป็นต้องใช้นักแสดง
หากเป็นเพียงอักขระ 0-9 ตัวเดียวใน ASCII การลบค่าของอักขระศูนย์ ASCII ออกจากค่า ASCII ก็น่าจะใช้ได้ดี
หากคุณต้องการแปลงตัวเลขที่มากขึ้นสิ่งต่อไปนี้จะทำ:
char *string = "24";
int value;
int assigned = sscanf(string, "%d", &value);
** อย่าลืมตรวจสอบสถานะ (ซึ่งควรเป็น 1 หากใช้งานได้ในกรณีข้างต้น)
พอล.
char chVal = '5';
char chIndex;
if ((chVal >= '0') && (chVal <= '9')) {
chIndex = chVal - '0';
}
else
if ((chVal >= 'a') && (chVal <= 'z')) {
chIndex = chVal - 'a';
}
else
if ((chVal >= 'A') && (chVal <= 'Z')) {
chIndex = chVal - 'A';
}
else {
chIndex = -1; // Error value !!!
}
เมื่อฉันต้องการทำสิ่งนี้ฉันจะสร้างอาร์เรย์ล่วงหน้าด้วยค่าที่ฉันต้องการ
const static int lookup[256] = { -1, ..., 0,1,2,3,4,5,6,7,8,9, .... };
จากนั้นการแปลงเป็นเรื่องง่าย
int digit_to_int( unsigned char c ) { return lookup[ static_cast<int>(c) ]; }
โดยพื้นฐานแล้วเป็นแนวทางที่นำมาใช้โดยการใช้งานไลบรารี ctype จำนวนมาก คุณสามารถปรับให้เข้ากับเลขฐานสิบหกได้เช่นกัน
ตรวจสอบสิ่งนี้
char s='A';
int i = (s<='9')?(s-'0'):(s<='F')?((s-'A')+10):((s-'a')+10);
ในราคาเพียง 0,1,2, .... , E, F.
เพียงใช้atol()
ฟังก์ชั่น:
#include <stdio.h>
#include <stdlib.h>
int main()
{
const char *c = "5";
int d = atol(c);
printf("%d\n", d);
}
หากตัวเลขของคุณคือสมมติว่า'5'
ใน ASCII จะแสดงเป็นเลขฐานสอง0011 0101
(53) ทุกหลักมีสี่บิตสูงสุด0011
และ 4 บิตต่ำสุดแทนตัวเลขใน bcd คุณก็แค่ทำ
char cdig = '5';
int dig = cdig & 0xf; // dig contains the number 5
เพื่อให้ได้ 4 บิตต่ำสุดหรือตัวเลขเท่ากัน ใน asm จะใช้and
การดำเนินการแทนsub
(เช่นเดียวกับคำตอบอื่น ๆ )
'5'
คือ 53 ( 00110101
)
นี่คือฟังก์ชั่นตัวช่วยที่อนุญาตให้แปลงตัวเลขใน char เป็น int และในทางกลับกัน:
int toInt(char c) {
return c - '0';
}
char toChar(int i) {
return i + '0';
}
ใช้ฟังก์ชัน: atoi สำหรับอาร์เรย์เป็นจำนวนเต็ม, atof สำหรับอาร์เรย์เป็นประเภทลอย; หรือ
char c = '5';
int b = c - 48;
printf("%d", b);
คุณจะส่งเป็น int (หรือ float หรือ double หรืออะไรก็ได้ที่คุณต้องการทำ) และเก็บไว้ในตัวแปร anoter