C中的ASCII char到int转换

时间:2010-07-01 18:56:09

标签: c

  

可能重复:
  Char to int conversion in C.

我记得很久以前在一门课程中学习通过减去'0'从ASCII字符转换为int是不好的。

例如:

int converted;
char ascii = '8';

converted = ascii - '0';

为什么这被认为是一种不好的做法?是因为某些系统不使用ASCII吗?这个问题一直困扰着我。

3 个答案:

答案 0 :(得分:7)

虽然您可能不应该将此作为手动strtol的一部分(这就是标准库的用途),但这种技术将单个数字转换为其值并没有任何问题。它简单明了,甚至是惯用语。但是,如果您不确定给定的char是否在范围内,您应该添加范围检查。

这是一种C语言保证,这是有效的。

5.2.1 / 3说:

  

在源和执行基本字符集中,上面列表中0之后的每个字符的值[包括序列:0,1,2,3,4,5,6,7,8 ,9]应比前一个值大一个。

字符集可能存在,但这不是真的,但它们不能在任何C实现中用作源代码或执行字符集。

答案 1 :(得分:3)

编辑:显然C标准保证连续0-9位。

C标准不保证ASCII,实际上使其不可移植。您应该使用用于转换的标准库函数,例如atoi。 但是,如果您希望对运行的位置做出假设(例如,空间非常宝贵的嵌入式系统),那么请务必使用减法方法。即使在不在US-ASCII代码页(UTF-8,其他代码页)的系统上,这种转换也可以。它将适用于ebcdic(令人惊讶)。

答案 2 :(得分:0)

这是C类中教授的一个常见技巧,主要是为了说明char是一个数字,并且它的值与相应的int不同。

不幸的是,这个教育玩具不知何故成为大多数C开发人员的典型武器库的一部分,部分原因是因为C没有为此提供方便的调用(它通常是特定于平台的,我甚至不确定它是什么)。

通常,此代码对于非ASCII平台以及将来转换为其他编码不可移植。它也不是真的可读。至少在一个函数中包装这个技巧。