手动输入十进制ip地址-->
ipput:255.255.255.255
output:11111111.11111111.11111111.11111111
input:0.0.0.0
output:00000000.00000000.00000000.00000000
说说实现过程吧,其实核心是简单的将十进制转换为二进制,也是利用桟,先进后出,然后保存二进制数字。
注意:1.输入输出均为字符串。
2.输入部分加入了对ip地址合法性的检验,首先保证输入进的ip地址是正确的;
//将十进制ip地址转换为二进制ip地址
#include<iostream>
#define max 100
using namespace std;
bool ip=true;
struct stack
{
int Top;
int MaxSize;
int *element;
};
typedef struct stack Stack;
void Init(Stack *S,int n)//初始化桟
{
if(n>0)
{
S->Top=-1;
S->MaxSize=n;
S->element=new int [S->MaxSize];
}
}
bool IsFull(Stack *S)//判断桟是否为满
{
return (S->Top==S->MaxSize-1);
}
bool IsEmpty(Stack *S)//判断桟是否为空
{
return (S->Top==-1);
}
void push(Stack *S,int n)//入栈
{
if(!IsFull(S))
S->element[++S->Top]=n;
else
{
cout<<"桟满";
}
}
int pop(Stack *S)//出桟
{
if(!IsEmpty(S))
return S->element[S->Top--];
else
{
cout<<"桟空";
return -1;
}
}
void change(Stack *S,char ip_add[],char ip_Add[])
{
int i=0,j=0,n=-1,k=0;
int count=0;
while(*(ip_add+i)!='\0')
{
while(*(ip_add+i)>='0'&&*(ip_add+i)<='9')
{
count=count*10 + *(ip_add+i) - '0';//输入为字符串,数字为ASCII码,转换为int
i++;
}
while(count>0)//将 '.'前面的字符串转化为二进制,入栈
{
j=count%2;
push(S,j);
count/=2;
k++;
}
while(k<8)//在二进制数字后面补齐缺少的 ‘0’ 的个数
{
for(int i=0;i<8-k;k++)
push(S,0);
}
while(!IsEmpty(S))//将 '.'前面的二进制int出栈
{
int s;
s=pop(S);
ip_Add[++n]=s + '0';
}
if(*(ip_add+i)=='.')
{
ip_Add[++n]='.';
i++;
k=0;
}
else
{
break;
}
}
ip_Add[n+1]='\0';
}
void input_ip_add(Stack *S,char ip_add[])
{
cout<<"请输入ip地址:";
char ch;
int i=0;
int count=0;
while((ch = getchar())!='\n')
{
if(ch!='.')
{
count=count*10 + ch - '0';
if(count>255)
{
ip=false;
}
ip_add[i++]=ch;
}
else
{
ip_add[i++]=ch;
count=0;
}
}
ip_add[i]='\0';
}
int main()
{
Stack *S=new Stack;
Init(S,max);
char ip_add[20];
char ip_Add[40];
input_ip_add(S,ip_add);
if(ip)
{
cout<<"原始ip:"<<endl;
cout<<ip_add;
cout<<endl;
}
else
{
cout<<"非法IP!"<<endl;
}
change(S,ip_add,ip_Add);
if(ip)
{
cout<<"转换为二进制:"<<endl;
cout<<ip_Add;
cout<<endl;
}
system("pause");
return 0;
}