C/C++整数与IP地址间的转换

原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
一个长整数。
举例:一个ip地址为10.0.3.193
每段数字             相对应的二进制数
10                   00001010
0                    00000000
3                    00000011
193                  11000001
组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。

 

的每段可以看成是一个0-255的整数,需要对IP地址进行校验

 

 

 

输入描述:

输入  1 输入IP地址 2 输入10进制型的IP地址

输出描述:

输出 1 输出转换成10进制的IP地址 2 输出转换后的IP地址

示例1

输入

10.0.3.193
167969729

输出

167773121
10.3.3.193
编程方案:
一,数据输入统一识别转换,再位运算
#include<string>  //https://zhidao.baidu.com/question/555168302.html
#include<string.h>
using namespace std;//不需要转换二进制数
int main(){
    string s,s1;
 unsigned int a[5];unsigned int b;// u_int8_t b1;
    unsigned int c;int d[4];
    int i,m;
  //const char *c_str();getline(cin,s,'.') a[m]=atoi(s1.c_str());m++;
     //  c_str()函数返回一个指向正规C字符串的指针常量, 内容与本string串相同. 
     //应该这样用: char c[20]; string s="1234"; strcpy(c,s.c_str()); //sting转换为char类型
    //    std::string s = "152"; std::stringstream ss; int num1 = std::atoi( s.c_str() );//string转换为int


    //,a[i]=atoi(s.c_str()),
      while( cin>>s>>b){  //没有while时出现问题:空。请检查一下你的代码,有没有循环输入处理多个case。


       m=0;
      for(i=0;i<s.size()+1;i++)
         { if(s[i]<='9'&&s[i]>='0')
           s1.push_back(s[i]);
           else 
           {
            a[m]=atoi(s1.c_str());//字符串string转int
               m++;
            s1.clear();
           }
         }
      c=(a[0]<<24)+(a[1]<<16)+(a[2]<<8)+a[3];
      cout<<c<<endl;
      i=4;
       while(i--)//先i--再进循环******3210
      {
       d[i]=b&255;
       b=b>>8;
      }
        
        cout<<d[0]<<'.';
        cout<<d[1]<<'.';
        cout<<d[2]<<'.';
        cout<<d[3]<<endl;
      }
}
二,输入短数据自动识别,位运算
#include<iostream>
#include<stack>
#include<string>
using namespace std;
int main()
{
unsigned int a,b,c,d;
char ch;
while(cin>>a>>ch>>b>>ch>>c>>ch>>d)//输入点肯定不会识别为数字
    {
cout<<((a<<24)|(b<<16)|(c<<8)|d)<<endl;
cin>>a;
cout<<((a&0xff000000)>>24)<<"."<<((a & 0x00ff0000)>>16)<<"."<<((a&0x0000ff00)>>8)<<"."<<(a & 0x000000ff)<<endl;
    }
return 0;


}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值