當時面試上機的想法是,直接使用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()函數,無論是性能和簡潔程度都無法比。
教訓是,在看一些優秀的代碼時,不能走馬觀花!努力去思考當時作者的想法。
