今天遇到一个问题
题目描述:
实现函数 unsigned int ipanel_parse_ip_addr(const char*ip)
功能:解析IPv4地址
测试用例:
unsigned int ip addr=ipanel_parse_ip_addr("192.168.10.1");
printf("%x ",ip_addr);
要求输出:c0a80a01不允许使用字符串相关库函数
请在程序关键步骤增加必要注释。
分析:
首先在函数中ipanel_parse_ip_addr要将点分十进制字符串中的数字解析出来,然后将其存储一个大小为4的共用体中,将整数转换为ascii码,因为char只能到127,如果ip中的数字大于了127,就要用unsigned char,共用体中定义一个unsigned char [4]的数组,以及一个int型变量,将解析出来的数字转换为ascII的值,然后存储到unsigned char [4]数组中,因为Linux和windows的机器都是小端模式的,所以第一个值要存储在下标为3,第四个值要存储在0下标,然后再将共用体中的int型变量a以十六进制输出,就可以得到结果。
要点:
将一个int型整数转换为这个值的ascii码:
int i=192; unsigned char c=unsigned char(i);
程序如下:
union un { int a; unsigned char b[4]; }myUn; unsigned int ipnel_parse_ip_addr(const char* ip) { int tmp[4]; sscanf(ip,"%d.%d.%d.%d",&tmp[3],&tmp[2],&tmp[1],&tmp[0]); for (int i = 0; i < 4; i++) { myUn.b[i] = unsigned char(tmp[i]); } return myUn.a; } int main() { unsigned int ip_addr = ipnel_parse_ip_addr("192.168.10.1"); printf("%x ",ip_addr); return 0; }
运行结果: