在看黑书C语言第二版的时候,遇到了atoi()函数,其中有一条语句不太好理解。但认真看一下,其实原理很简单。
#include <stdio.h> #include <ctype.h> /* * atoi()函数:将字符串s转换为整型数。 */ int main(void) { char s[] = "-123"; printf("atoi = %d", atoi(s)); return 0; } int atoi(char s[]) { int i, n, sign; for (i=0; isspace(s[i]); i++) { ; } /* 跳过空白符 */ sign = (s[i] == '-') ? -1 : 1; /* 保存符号位 */ if (s[i] == '+' || s[i] == '-') { i++; } /* 跳过符号 */ for (n=0; isdigit(s[i]); i++) { n = n * 10 + (s[i] - '0'); /* 将字符串转换为整型数 */ printf("n is %d\n", n); } return sign * n; }输出:
n is 1 n is 12 n is 123 atoi = -123其中,
for (...) { n = n * 10 + (s[i] - '0'); /* 将字符串转换为整型数 */ ... }可能比较难理解,s[i] - '0' 实际上是对应的十进制ASCII码相减,数字0到9的ASCII码为48到57。在这个for循环中有:
Loop1:n = 10 * 0 + (49-48) = 1 // 1的ASCII码为49,0的ASCII码为48;Loop2:n = 10 * 1 + (50-48) = 12 // 2的ASCII码为50,0的ASCII码为48;Loop3:n = 10 * 12 + (51-48) = 123 // 3的ASCII码为51,0的ASCII码为48;所以,最后加上符号位,有结果-123。