在C语言中将字符转换为整数的问题

3
我在将字符变量转换为整数变量时遇到了问题。这是我的代码:

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


int main()
{
    char string[] = "A2";
    char letter = string[0];
    char number = string[1];
    char numbers[] = "12345678";
    char letters[] = "ABCDEFGH";
    int row;
    int column;

    for(int i = 0; i < 8; i++){
        if(number == numbers[i]){
            row = number;
        }
    }
}

当我试图将变量row转换为变量number的整数值时,我得到的不是2而是50。目前的目标是将变量row转换为字符变量number的准确值,这种情况下是2。我有点困惑为什么变量row是50而不是2。有人能解释一下为什么它没有准确转换吗?

50 是字符 '2' 的 ASCII 数字值。也许您在 printf 中使用了错误的格式说明符。 - Weather Vane
谷歌“ASCII表” - zzxyz
1
当你想要获取文本数字的值时,使用value = digit - '0'是一种常见的习惯用法。这将从数字字符中减去ASCII值0(48),或者如果你有一个非ASCII系统,则减去相应的值。 - Lee Daniel Crocker
2个回答

4

'2' != 2。在ASCII码中,字符'2'的十进制表示为50(十六进制表示为0x32)。请参考http://www.asciitable.com/

如果你确认它们是数字,则可以直接使用(numbers[i] - '0')来获取所需的值。


2

在你的情况中,2是一个字符,该字符的值为50,因为这是表示ASCII中字符2的字节值的十进制版本。记住,C语言非常底层,字符本质上与任何其他值相同:一系列字节。就像字母用字节表示一样,它们在我们的十进制系统中的字符表示也是如此。可能看起来2应该用值2表示,但实际上并不是。

如果您使用atoi函数,则会查看字符串并计算字符串中表示的十进制值。

但是,如果您只将一个字符转换为其表示的十进制值,则可以采取捷径。从'0'的值中减去数字即可。虽然对于人类来说,这些数字不是用它们在基数10中的值表示的,但它们在ASCII码中是按顺序排列的。由于在C语言中,字符仅是字节值,因此数字字符0-9和0之间的差值就是该字符的值。

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

如果你明白为什么那样做会有效,那你就理解我的意思了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接