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'的char值是连续的,但不保证其他字符如字母表的字母。

其他提示

像这样减去'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 到一个 long, ,将其视为基础 base 数字。如果 **endptr 不为空,它包含第一个非数字字符 strtol() 发现了(但谁在乎这个)。

像这样减去char'0'或int 48:

char c = '5';
int i = c - '0';

说明:在内部,它适用于 ASCII 值。从ASCII表中,字符 5的十进制值为53 0为48 。所以 53 - 48 = 5

OR

char c = '5';
int i = c - 48; // Because decimal value of char '0' is 48

这意味着如果您从任何数字字符中扣除 48 ,它将自动转换整数。

char numeralChar = '4';
int numeral = (int) (numeralChar - '0');

将字符数字转换为相应的整数。如下所示:

char c = '8';                    
int i = c - '0';

上面计算的逻辑是使用ASCII值。字符8的ASCII值为56,字符0的ASCII值为48.整数8的ASCII值为8.

如果我们减去两个字符,则字符ASCII之间会发生减法。

int i = 56 - 48;   
i = 8;

如果它只是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 !!!
}

当我需要做这样的事情时,我会预先设置一个包含我想要的值的数组。

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中,它使用操作而不是 sub (如在其他答案中那样)。

使用函数:atoi表示数组为整数,atof表示数组为float类型; 或

char c = '5';
int b = c - 48;
printf("%d", b);

您可以将它转换为int(或浮点数或双精度或其他任何你想用它做的事)并将其存储在anoter变量中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top