将字符数字转换为C中的相应整数
Posted
技术标签:
【中文标题】将字符数字转换为C中的相应整数【英文标题】:Convert a character digit to the corresponding integer in C 【发布时间】:2010-10-12 08:11:29 【问题描述】:有没有办法在 C 中将字符转换为整数?
例如,从'5'
到 5?
【问题讨论】:
【参考方案1】:根据其他回复,这很好:
char c = '5';
int x = c - '0';
另外,对于错误检查,您可能希望首先检查 isdigit(c) 是否为真。请注意,您不能对字母进行完全可移植的操作,例如:
char c = 'b';
int x = c - 'a'; // x is now not necessarily 1
标准保证数字 '0' 到 '9' 的 char 值是连续的,但不保证其他字符(如字母表)。
【讨论】:
@Paul Tomblin:是的,对于数字而不是字母,因为正如我在回答中所说,标准保证 '0' 到 '9' 是连续的,但不对其他字符做出这样的保证,例如'a' 到 'z'。 char c = 'b'; int x = c - 'a';那么 x 只会在 ASCII 中为 1? @Pan 在任何编码中,包括 ASCII,'b' 1 多于 'a'。这在 EBCDIC 中仍然成立,但它使 ('j' - 'i') == 8。 @ChrisYoung 为什么?因为在 EBCDIC 中,'j' 不比 'i' 多 1? 我在这里没有使用 atoi 的地方缺少什么?【参考方案2】:像这样减去“0”:
int i = c - '0';
C 标准保证'0'..'9'
范围内的每个数字都比其前一个数字大一个(在C99 draft 的5.2.1/3
部分)。 C++ 也是如此。
【讨论】:
如果您提到 char 是/已经/实际上是一个整数、实现定义的符号(即,可能是有符号或无符号)并且是 CHAR_BITS 长,那么这个答案会更好。 我不确定这是否真的对他有帮助。但克里斯提出了一个很好的观点,a..z 不一定是连续的。我应该提到这一点。现在他赢得了比赛:) 你的更好,因为你已经确定了你的答案,不过——克里斯很可能只是编造了他的东西。 :) 感谢您的赞赏。我承认我不确定 C 的状态。所以我抬头看了看,因为我已经在上面了,所以我将参考粘贴到答案中:) 先生,这就是为什么你比我多几分的原因。 :)【参考方案3】:如果出于某种疯狂的巧合,您想将 字符串 字符转换为整数,您也可以这样做!
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
转换为long
,将其视为基本base
数字。如果**endptr
不为空,则它包含找到的第一个非数字字符strtol()
(但谁在乎呢)。
【讨论】:
atoi 没有线程问题(它没有静态数据),也没有被弃用。实际上它在功能上等价于:#define atoi(x) (int)(strtol((x), NULL, 10) atoi 的问题是它使用 0 作为“在这里找不到数字”的值,所以 atoi("0") 和 atoi("one") 都返回 0。如果那样不适用于您的用途,请查找 strtol() 或 sscanf()。 strtol 的另一个优点当然是您可能需要从数字后面的同一字符串中读取其他内容。 @EvanTeran 不幸的是,如果您运行 Visual Studio,您会收到一个折旧警告(并且在没有被禁用的情况下无法编译)。 VS 现在推荐itoa_s()
。【参考方案4】:
将字符数字转换为对应的整数。如下图所示:
char c = '8';
int i = c - '0';
上述计算背后的逻辑是使用 ASCII 值。字符 8 的 ASCII 值是 56,字符 0 的 ASCII 值是 48。整数 8 的 ASCII 值是 8。
如果我们将两个字符相减,则会在字符的 ASCII 之间进行减法。
int i = 56 - 48;
i = 8;
【讨论】:
为什么只有我一个赞成这个?解释是如此简单和翔实:+1: 谢谢,这个解释涵盖了这样一个事实,即研究 C 的这个属性的人可能无法将这些点连接回 ASCII。我直接从 K&R 来到这里,他们对此有点掩饰。【参考方案5】:像这样减去 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,它会自动转换成整数。
【讨论】:
【参考方案6】:char numeralChar = '4';
int numeral = (int) (numeralChar - '0');
【讨论】:
numeralChar - '0'
已经是 int
类型,所以你不需要演员表。即使不是,也不需要演员表。
嗯,是的,这会强制,不是吗?也许 Java 影响了我的看法。或者也许我完全错了,它甚至会在 Java 中强制执行。 :)【参考方案7】:
这里是帮助函数,允许将 char 中的数字转换为 int,反之亦然:
int toInt(char c)
return c - '0';
char toChar(int i)
return i + '0';
【讨论】:
【参考方案8】:只需使用atol()
函数:
#include <stdio.h>
#include <stdlib.h>
int main()
const char *c = "5";
int d = atol(c);
printf("%d\n", d);
【讨论】:
【参考方案9】:如果它只是 ASCII 中的单个字符 0-9,那么从 ASCII 值中减去 ASCII 零字符的值应该可以正常工作。
如果你想转换更大的数字,那么下面会做:
char *string = "24";
int value;
int assigned = sscanf(string, "%d", &value);
** 不要忘记检查状态(如果在上述情况下有效,则应为 1)。
保罗。
【讨论】:
【参考方案10】: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 !!!
【讨论】:
【参考方案11】:当我需要做这样的事情时,我会用我想要的值预烘焙一个数组。
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 库的许多实现所采用的方法。 您也可以轻松地将其调整为使用十六进制数字。
【讨论】:
转换单个十进制(或八进制)数字似乎效率极低。如果查找表的相关部分恰好不在 L1 缓存中,那么您将花费大量周期将其拉入以获取一个值。坦率地说,如果你要转换一大堆数字,我倾向于怀疑这甚至是一个好主意,但你必须测量它。当然,十六进制更具竞争力。【参考方案12】:检查一下,
char s='A';
int i = (s<='9')?(s-'0'):(s<='F')?((s-'A')+10):((s-'a')+10);
仅适用于 0,1,2,....,E,F.
【讨论】:
【参考方案13】:如果你的数字是 '5'
,在 ASCII 中它表示为二进制数 0011 0101
(53)。每个数字都有最高四位0011
,最低四位代表 bcd 中的数字。所以你就这样做
char cdig = '5';
int dig = cdig & 0xf; // dig contains the number 5
获取最低的 4 位,或者,同样的,数字。在 asm 中,它使用 and
操作而不是 sub
(与其他答案一样)。
【讨论】:
'5'
是 53(00110101
)
@eyllanesc 起初它是 4。谢谢。已编辑。【参考方案14】:
您可以将其转换为 int(或 float 或 double 或您想用它做的任何其他事情)并将其存储在另一个变量中。
【讨论】:
【参考方案15】:使用函数:atoi 为数组转整数,atof 为数组转浮点型; 或
char c = '5';
int b = c - 48;
printf("%d", b);
【讨论】:
几个答案已经涵盖了这一点。这增加了他们尚未涵盖的任何内容。以上是关于将字符数字转换为C中的相应整数的主要内容,如果未能解决你的问题,请参考以下文章
刚学C语言,不太懂。把键盘输入的由数字字符组成的字符串转换为相应的数字。例如把"123"转换为整数123