C/C++ ip地址与int类型的转换实例详解
C/C++ip地址与int类型的转换实例详解
前言
最近看道一个面试题目,大体意思就是将ip地址,例如“192.168.1.116”转换成int类型,同时还能在转换回去
思路
ip地址转int类型,例如ip为“192.168.1.116”,相当于“.“将ip地址分为了4部分,各部分对应的权值为256^3,256^2,256,1,相成即可
int类型转ip地址,思路类似,除以权值即可,但是有部分字符串的操作
实现代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#defineLEN16
typedefunsignedintuint;
/**
*字符串转整形
*/
uintipTint(char*ipstr)
{
if(ipstr==NULL)return0;
char*token;
uinti=3,total=0,cur;
token=strtok(ipstr,".");
while(token!=NULL){
cur=atoi(token);
if(cur>=0&&cur<=255){
total+=cur*pow(256,i);
}
i--;
token=strtok(NULL,".");
}
returntotal;
}
/**
*逆置字符串
*/
voidswapStr(char*str,intbegin,intend)
{
inti,j;
for(i=begin,j=end;i<=j;i++,j--){
if(str[i]!=str[j]){
str[i]=str[i]^str[j];
str[j]=str[i]^str[j];
str[i]=str[i]^str[j];
}
}
}
/**
*整形转ip字符串
*/
char*ipTstr(uintipint)
{
char*new=(char*)malloc(LEN);
memset(new,'\0',LEN);
new[0]='.';
chartoken[4];
intbt,ed,len,cur;
while(ipint){
cur=ipint%256;
sprintf(token,"%d",cur);
strcat(new,token);
ipint/=256;
if(ipint)strcat(new,".");
}
len=strlen(new);
swapStr(new,0,len-1);
for(bt=ed=0;ed<len;){
while(ed<len&&new[ed]!='.'){
ed++;
}
swapStr(new,bt,ed-1);
ed+=1;
bt=ed;
}
new[len-1]='\0';
returnnew;
}
intmain(void)
{
charipstr[LEN],*new;
uintipint;
while(scanf("%s",ipstr)!=EOF){
ipint=ipTint(ipstr);
printf("%u\n",ipint);
new=ipTstr(ipint);
printf("%s\n",new);
}
return0;
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!