将字符数字转换为C中的相应整数

时间:2009-03-10 02:53:12

标签: c type-conversion

有没有办法将字符转换为C中的整数?

例如,从'5'到5?

15 个答案:

答案 0 :(得分:111)

根据其他回复,这很好:

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

答案 1 :(得分:36)

像这样减去'0':

int i = c - '0';

C标准保证'0'..'9'范围内的每个数字都比其前一个数字(C99 draft5.2.1/3部分)大一个数字。 C ++也是如此。

答案 2 :(得分:24)

如果,由于某种疯狂的巧合,您想将字符串字符转换为整数,那么您也可以这样做!

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()(但是谁会关心它)。

答案 3 :(得分:6)

减去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 ,它将自动转换整数。

答案 4 :(得分:5)

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

答案 5 :(得分:3)

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

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

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

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

int i = 56 - 48;   
i = 8;

答案 6 :(得分:0)

如果它只是ASCII中的单个字符0-9,那么从ASCII值中减去ASCII零字符的值应该可以正常工作。

如果您想转换较大的数字,则以下内容将执行:

char *string = "24";

int value;

int assigned = sscanf(string, "%d", &value);

**不要忘记检查状态(如果在上述情况下有效,则应为1)。

保罗。

答案 7 :(得分:0)

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 !!!
}

答案 8 :(得分:0)

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

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库的许多实现所采用的方法。 您可以轻松地调整它以使用十六进制数字。

答案 9 :(得分:0)

检查一下,

char s='A';

int i = (s<='9')?(s-'0'):(s<='F')?((s-'A')+10):((s-'a')+10);

仅适用于0,1,2,....,E,F。

答案 10 :(得分:0)

只需使用atol()功能:

#include <stdio.h>
#include <stdlib.h>

int main() 
{
    const char *c = "5";
    int d = atol(c);
    printf("%d\n", d);

}

答案 11 :(得分:0)

如果您的数字是'5',则以ASCII表示为二进制数0011 0101(53)。每个数字都有最高的四位0011,而最低的四位代表bcd中的数字。所以你就做

char cdig = '5';
int dig = cdig & 0xf; // dig contains the number 5

以获得最低的4位或相同的位数。在asm中,它使用and运算符代替sub(与其他答案一样)。

答案 12 :(得分:0)

这里有一些辅助函数,可以将char中的数字转换为int,反之亦然:

int toInt(char c) {
    return c - '0';
}

char toChar(int i) {
    return i + '0';
}

答案 13 :(得分:-2)

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

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

答案 14 :(得分:-3)

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