我是C的新手,我在C中寻找一个自定义函数,它将字符串转换为整数,我遇到了这个算法,除了一个部分之外,这个算法非常有意义。 -'0'
在这一行n = n * 10 + a[c] - '0';
上做了什么?
int toString(char a[]) {
int c, sign, offset, n;
if (a[0] == '-') { // Handle negative integers
sign = -1;
}
if (sign == -1) { // Set starting position to convert
offset = 1;
}
else {
offset = 0;
}
n = 0;
for (c = offset; a[c] != '\0'; c++) {
n = n * 10 + a[c] - '0';
}
if (sign == -1) {
n = -n;
}
return n;
}
该算法没有我在哪里找到解释here。
答案 0 :(得分:4)
减去'0'
的原因是,十进制数字的字符代码点从'0'
开始按顺序排列,没有间隙。换句话说,'5'
的字符代码比'0'
的字符代码大5; '6'
的字符代码比'0'
的字符代码大6,依此类推。因此,从另一个数字的代码中减去零'0'
的代码会产生相应数字的值。
这种安排对于ASCII码,EBSDIC,十进制数字的UNICODE代码等是正确的。对于ASCII代码,数字代码如下所示:
'0' 48
'1' 49
'2' 50
'3' 51
'4' 52
'5' 53
'6' 54
'7' 55
'8' 56
'9' 57
答案 1 :(得分:2)
假设x
的值介于'0'
和'9'
之间,x - '0'
会产生0
和9
之间的值。所以x - '0'
基本上将十进制数字字符常量转换为其数字整数值(例如,'5'
到5
)。
C表示'0'
到'9'
是实现定义的值,但C也保证'0'
到'9'
是连续值。