#include <stdio.h> #include <string.h> int main(void) { char* s = "357"; int sum = 0; int i = 0; for (i = 0; i < strlen(s); i++) { sum += s[i] - 48; } printf("Sum is %d",sum); return 0; }
有人可以解释代码的作用,尤其是48部分的减法吗?
解决方法
>该字符串仅包含’0′..’9’范围内的字符
>使用的字符编码是ASCII
在ASCII中,’0’== 48,’1’== 49,依此类推.因此,’0′ – 48 == 0,’1′ – 48 == 1,依此类推.也就是说,减去48会将char值’0’…’9’转换为int值0..9.
因此,正是因为’0’== 48,代码也适用于:
sum += s[i] - '0';
在这个版本中,意图可能稍微清楚一些.
你当然可以通过添加进行“反向”映射,例如5’0’==’5′.类似地,如果你有一个包含’A’…’Z’范围内的字母的字符,你可以从中“减去”’A’以获得该字母在0..25范围内的索引.
也可以看看
> Wikipedia/Digit sum
> Wikipedia/ASCII
相关问题
> How to convert a single char into an int
> Language showdown: Convert string of digits to array of integers?
>这个数字转换的许多例子,使用’0’和48的减法!
关于替代编码
如上所述,原始的 – 48代码假定使用的字符编码是ASCII. – ‘0’不仅提高了可读性,而且放弃了ASCII假设,并且可以使用C语言规定的任何编码,C语言规定必须在连续的块中顺序编码数字字符.
另一方面,没有对字母作出这样的规定.因此,在您使用EBCDIC编码的极少数情况下,例如,将’A’…’Z’映射到0..25不再像减去’A’那么简单,因为字母不是在EBCDIC中的连续块中顺序编码.
一些编程语言通过强制使用一个特定的编码来表示源代码来简化问题(例如,Java使用Unicode:JLS §3.1)
也可以看看
> Wikipedia/Extended Binary Coded Decimal Interchange Code (EBCDIC)
相关问题