C++实现将十进制的ip地址转换为二进制ip地址

 

手动输入十进制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;
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值