题解 | #整数与IP地址间的转换#
整数与IP地址间的转换
http://www.nowcoder.com/practice/66ca0e28f90c42a196afd78cc9c496ea
//整数与ip地址间的转化
#include "stdio.h"
#include "string.h"
#define uint8_t unsigned char
#define int8_t signed char
#define uint16_t unsigned short
#define int16_t signed short
#define uint32_t unsigned int
#define int32_t signed int
uint32_t ip_to_bin(uint8_t* array)
{
uint32_t res = array[3] + (array[2]<<8) + (array[1]<<16) + (array[0]<<24);
printf("%u\n",res);//注意打印,%d容量不够
return res;
}
uint8_t bin_to_ip(uint32_t number)
{
//为什么要与0xff?因为32位数据,我们每次只要低8位,右移后有些数据会长于8位,所以用0xff截掉前面的高位。
printf("%d.%d.%d.%d\n",number>>24,number>>16&0xff,number>>8&0xff,number&0xff);
return 0;
}
uint8_t if_ip_addr(uint8_t* addr,uint8_t len)
{
int ret = 0;
for(uint8_t i=0;i<len;i++)
{
if(addr[i]=='.')
ret = 1;
}
return ret;
}
int main()
{
uint8_t input_data[32] = {0};
while (gets(input_data))
{
uint8_t is_ip_addr = 0;
is_ip_addr = if_ip_addr(input_data,strlen(input_data));
if(is_ip_addr)
{
uint8_t ip_array[4] = {0};
sscanf(input_data,"%d.%d.%d.%d",&ip_array[0],&ip_array[1],&ip_array[2],&ip_array[3]);
ip_to_bin(ip_array);
}
else{
uint32_t number = 0;
sscanf(input_data,"%u",&number);
bin_to_ip(number);
}
}
return 0;
}