我记得很久以前在一门课程中学习通过减去'0'从ASCII字符转换为int是不好的。
例如:
int converted;
char ascii = '8';
converted = ascii - '0';
为什么这被认为是一种不好的做法?是因为某些系统不使用ASCII吗?这个问题一直困扰着我。
答案 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平台以及将来转换为其他编码不可移植。它也不是真的可读。至少在一个函数中包装这个技巧。