原理: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; }