Câu trả lời:
Theo các câu trả lời khác, điều này ổn:
char c = '5';
int x = c - '0';
Ngoài ra, để kiểm tra lỗi, trước tiên bạn có thể kiểm tra isdigit (c) là đúng. Lưu ý rằng bạn không thể hoàn toàn di động làm tương tự cho các chữ cái, ví dụ:
char c = 'b';
int x = c - 'a'; // x is now not necessarily 1
Tiêu chuẩn đảm bảo rằng các giá trị char cho các chữ số từ '0' đến '9' là liền nhau, nhưng không đảm bảo cho các ký tự khác như các chữ cái trong bảng chữ cái.
Trừ '0' như thế này:
int i = c - '0';
Tiêu chuẩn C đảm bảo mỗi chữ số trong phạm vi '0'..'9'
lớn hơn một chữ số trước đó (trong phần 5.2.1/3
của dự thảo C99 ). Số lượng tương tự đối với C ++.
Nếu do một sự trùng hợp ngẫu nhiên nào đó, bạn muốn chuyển đổi một chuỗi ký tự thành một số nguyên, bạn cũng có thể làm điều đó!
char *num = "1024";
int val = atoi(num); // atoi = ASCII TO Int
val
bây giờ là 1024. Rõ ràng atoi()
là ổn, và những gì tôi đã nói về nó trước đó chỉ áp dụng cho tôi (trên OS X (có thể (chèn trò đùa Lisp vào đây))). Tôi đã nghe nói rằng đó là một macro ánh xạ gần đúng đến ví dụ tiếp theo, sử dụng strtol()
, một chức năng có mục đích chung hơn, để thực hiện chuyển đổi thay thế:
char *num = "1024";
int val = (int)strtol(num, (char **)NULL, 10); // strtol = STRing TO Long
strtol()
hoạt động như thế này:
long strtol(const char *str, char **endptr, int base);
Nó chuyển đổi *str
thành a long
, coi nó như thể nó là một base
số cơ sở . Nếu **endptr
không phải là null, nó chứa ký tự không phải chữ số đầu tiên strtol()
được tìm thấy (nhưng ai quan tâm đến điều đó).
itoa_s()
.
Trừ char '0' hoặc int 48 như thế này:
char c = '5';
int i = c - '0';
Giải thích: Bên trong nó hoạt động với giá trị ASCII . Từ bảng ASCII, giá trị thập phân của ký tự 5 là 53 và 0 là 48 . Vậy 53 - 48 = 5
HOẶC LÀ
char c = '5';
int i = c - 48; // Because decimal value of char '0' is 48
Điều đó có nghĩa là nếu bạn trừ 48 từ bất kỳ ký tự số nào, nó sẽ tự động chuyển đổi thành số nguyên.
char numeralChar = '4';
int numeral = (int) (numeralChar - '0');
numeralChar - '0'
đã là loại int
, vì vậy bạn không cần diễn viên. Ngay cả khi nó không phải, diễn viên là không cần thiết.
Để chuyển đổi chữ số ký tự thành số nguyên tương ứng. Làm như hình bên dưới:
char c = '8';
int i = c - '0';
Logic đằng sau phép tính trên là sử dụng các giá trị ASCII. Giá trị ASCII của ký tự 8 là 56, giá trị ASCII của ký tự 0 là 48. Giá trị ASCII của số nguyên 8 là 8.
Nếu chúng ta trừ hai ký tự, phép trừ sẽ xảy ra giữa ASCII của các ký tự.
int i = 56 - 48;
i = 8;
Nếu đó chỉ là một ký tự đơn 0-9 trong ASCII, thì việc trừ giá trị của ký tự 0 ASCII khỏi giá trị ASCII sẽ hoạt động tốt.
Nếu bạn muốn chuyển đổi các số lớn hơn thì thao tác sau sẽ thực hiện:
char *string = "24";
int value;
int assigned = sscanf(string, "%d", &value);
** đừng quên kiểm tra trạng thái (phải là 1 nếu nó hoạt động trong trường hợp trên).
Paul.
Khi tôi cần làm điều gì đó như thế này, tôi bắt đầu một mảng với các giá trị tôi muốn.
const static int lookup[256] = { -1, ..., 0,1,2,3,4,5,6,7,8,9, .... };
Sau đó, chuyển đổi dễ dàng
int digit_to_int( unsigned char c ) { return lookup[ static_cast<int>(c) ]; }
Về cơ bản đây là cách tiếp cận được thực hiện bởi nhiều triển khai của thư viện ctype. Bạn cũng có thể điều chỉnh điều này để làm việc với các chữ số hex.
Chỉ cần sử dụng atol()
chức năng:
#include <stdio.h>
#include <stdlib.h>
int main()
{
const char *c = "5";
int d = atol(c);
printf("%d\n", d);
}
Nếu chữ số của bạn là, chẳng hạn, '5'
trong ASCII, nó được biểu diễn dưới dạng số nhị phân 0011 0101
(53). Mọi chữ số đều có 4 bit cao nhất và 4 bit 0011
thấp nhất đại diện cho chữ số trong bcd. Vì vậy, bạn chỉ cần làm
char cdig = '5';
int dig = cdig & 0xf; // dig contains the number 5
để lấy 4 bit thấp nhất, hoặc chữ số tương tự. Trong asm, nó sử dụng and
phép toán thay vì sub
(như trong các câu trả lời khác).
'5'
là 53 ( 00110101
)
Dưới đây là các hàm trợ giúp cho phép chuyển đổi chữ số trong char thành int và ngược lại:
int toInt(char c) {
return c - '0';
}
char toChar(int i) {
return i + '0';
}
sử dụng hàm: atoi cho mảng thành số nguyên, atof cho mảng thành kiểu float; hoặc là
char c = '5';
int b = c - 48;
printf("%d", b);