将单个字符转换为整数

9

如何将 char a[0] 转换为 int b[0],其中 b 是一个空的动态分配的 int 数组

我尝试过

char a[] = "4x^0";
int *b;
b = new int[10];
char temp = a[0]; 
int temp2 = temp - 0;
b[0] = temp2;

我需要4,但它给我ASCII值52。

还有一个问题:

a[0] = atoi(temp);

给我一个错误:将“char”无效转换为“const char*”,在初始化“int atoi(const char*)”的参数1时。

请注意,atoi不起作用,因为atoi接受的是一个字符串而不是单个字符——这是非常好的原因,因为大多数数字都有多个数字! - Captain Segfault
3个回答

25
你需要做的是:
int temp2 = temp - '0';

相反。


从语言专家的角度来看,我想假设数字是连续的并不是有效的,因此这可能不是100%可移植的——尽管它在ASCII(及其扩展)和EBCDIC中都可以工作,所以实际上它很好。 - Captain Segfault
15
令人惊讶的是,即使对于一名语言专家来说也完全没有问题——ISO C90包含了以下不起眼的要求:“在源代码和执行环境的基本字符集中,上述十进制数字列表中每个字符的值均应比前一个字符大1”。 - Pavel Minaev
非常好,@Pavel。有很多代码都假定字母也是连续的,这使得将其移植到主机的UNIX子系统(USS,使用EBCDIC,不要与使用ASCII的zLinux混淆)非常麻烦。除了字符集的最小限制和数字字符的连续性之外,ISO C在这个领域并没有太多规定。 - paxdiablo

1

atoi() 版本无法工作是因为 atoi() 是在字符串上操作,而不是单个字符。所以这样可以工作:

char a[] = "4";
b[0] = atoi(a);

请注意,您可能会尝试执行: atoi(&temp) 但这不起作用,因为&temp 没有指向以null结尾的字符串。

0

您可以替换整个序列:

char a[] = "4x^0";
int *b;
b = new int[10];
char temp = a[0]; 
int temp2 = temp - 0;
b[0] = temp2;

使用更简单的方式:

char a[] = "4x^0";
int b = new int[10];
b[0] = a[0] - '0';

根本不需要搞临时变量。你需要使用'0'而不是0的原因是前者是字符'0',其值为48,而不是值0。

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