当时面试上机的想法是,直接使用uint32_t变量来存ip地址,遍历字符串带".",然后去值,利用移位来将这个值填到uint32_t对应的位置上。这样的麻烦之处在于:
1,遍历字符串,还得记录每个"."出现的位置;
2,移位操作;
而最巧妙的做法是,利用一个uint8_t的数组(长度为4)和sscanf函数进行取ip字符串对应的值:
uint32_t ip2long(char* ip) {
uint8_t addr[4] = {0};
sscanf(ip, "%d.%d.%d.%d", &addr[0],&addr[1],&addr[2],&addr[3]);
return *(uint32_t*)addr;
}
5行代码就搞掂,而我上机时候写的应该是接近20行了吧?而且循环调用atoi()函数,无论是性能和简洁程度都无法比。
教训是,在看一些优秀的代码时,不能走马观花!努力去思考当时作者的想法。