在 C 语言中有没有一种方法可以把一个字符转换成一个整数?
例如,从 '5'到5?
'5'
像这样减去0:
int i = c - '0';
C 标准保证范围 '0'..'9'中的每个数字比之前的数字大一个(在 C99草案的 5.2.1/3部分)。C + + 也是如此。
'0'..'9'
5.2.1/3
char numeralChar = '4'; int numeral = (int) (numeralChar - '0');
正如其他回复所言,这没什么问题:
char c = '5'; int x = c - '0';
此外,为了进行错误检查,您可能希望首先检查 isdigital (c)是否为 true。请注意,您不能完全便携地对字母执行相同的操作,例如:
char c = 'b'; int x = c - 'a'; // x is now not necessarily 1
该标准保证数字“0”到“9”的字符值是连续的,但不保证其他字符,如字母表中的字母。
您可以将它强制转换为一个 int (或 float 或 double,或者其他任何您想要用它来做的事情)并将它存储在另一个变量中。
如果它只是 ASCII 中的一个字符0-9,那么从 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 !!! }
如果出于某种疯狂的巧合,您想将字符的 绳子转换为整数,您也可以这样做!
char *num = "1024"; int val = atoi(num); // atoi = ASCII TO Int
val现在是1024。显然,atoi()是好的,我之前所说的只适用于我(在 OS X 上(也许(在这里插入 Lisp 笑话)))。我听说这是一个大致映射到下一个示例的宏,它使用更通用的函数 strtol()进行转换:
val
atoi()
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转换成 long,就好像它是一个基本的 base数字一样。如果 **endptr不为空,那么它保存找到的第一个非数字字符 strtol()(但是谁关心这个)。
*str
long
base
**endptr
当我需要做这样的事情时,我预先烘焙了一个数组,其中包含我想要的值。
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。
减去 char’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,它将自动转换整数。
只需使用 atol()函数:
atol()
#include <stdio.h> #include <stdlib.h> int main() { const char *c = "5"; int d = atol(c); printf("%d\n", d); }
将字符数字转换为相应的整数。如下所示:
char c = '8'; int i = c - '0';
上述计算背后的逻辑是使用 ASCII 值。字符8的 ASCII 值为56,字符0的 ASCII 值为48。整数8的 ASCII 值是8。
如果我们减去两个字符,字符的 ASCII 之间就会发生减法。
int i = 56 - 48; i = 8;
如果你的数字是,比如说,'5',在 ASCII 中它表示为二进制数 0011 0101(53)。每个数字都有最高的4位 0011,最低的4位代表 bcd 中的数字。所以你就这么做了
0011 0101
0011
char cdig = '5'; int dig = cdig & 0xf; // dig contains the number 5
得到最低的4位,或者,它的相同,数字。在一般情况下,它使用 and操作而不是 sub操作(如在其他答案中)。
and
sub
下面是帮助函数,它允许将 char 中的数字转换为 int,反之亦然:
int toInt(char c) { return c - '0'; } char toChar(int i) { return i + '0'; }