描述
原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
一个长整数。
举例:一个ip地址为10.0.3.193
每段数字 相对应的二进制数
10 00001010
0 00000000
3 00000011
193 11000001
组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。
数据范围:保证输入的是合法的 IP 序列
输入描述:
输入
1 输入IP地址
2 输入10进制型的IP地址
输出描述:
输出
1 输出转换成10进制的IP地址
2 输出转换后的IP地址
示例1
输入:
10.0.3.193 167969729
输出:
167773121 10.3.3.193
代码
#include<cstdio>
#include<string>
#include<vector>
using namespace std;
/*
IP地址 ==> 十进制(看作是256进制转化为10进制)
1)提取IP地址4部分整数
2)4部分整数看作256进制数 ==> 十进制整数
十进制数 ==> IP地址
1)字符串 ==> 整数
2)十进制整数 ==> 4个256进制数
*/
long long to_D(vector<int> vec) //256进制 --> 十进制
{
long long num=0;
int r=1;
for(int i=vec.size()-1;i>=0;i--)
{
num+=vec[i]*r;
r*=256;
}
return num;
}
int main()
{
// ---------1.读取数据-------------------------
// IP地址
char buf1[100];
fgets(buf1,100,stdin);
string str1=buf1;
// 10进制型IP地址
char buf2[100];
fgets(buf2,100,stdin);
string str2=buf2;
// ---------2 IP地址处理---------------------------
// 2.1 提取IP地址4部分整数
string num="";
vector<int> vec1;//存放四个整数
for(int i=0;i<str1.size();i++)
{
if(str1[i]>='0' && str1[i] <='9')
{
num.push_back(str1[i]);
}
else {
vec1.push_back(stoi(num)); //stoi():字符串 --> 整数
num="";
}
}
// 2.2 4部分十进制 ==> 十进制整型
long long IP_d=to_D(vec1);//保存十进制IP地址
//----------3.十进制IP地址处理--------------------------
// 3.1 字符串 ==> long long型
long long IP=stoll(str2);// str型 --> long long型
// 3.2 十进制 ==> 256进制
vector<int> vec2;//存由256进制转化得的4个整数
while(IP)
{
vec2.push_back(IP%256);
IP/=256;
}
// 输出
printf("%lld\n",IP_d);
printf("%d.%d.%d.%d",vec2[3],vec2[2],vec2[1],vec2[0]);
}
拓展:C/C++字符串变数字
| stoi() | 字符串 --> int型 |
| stoi() | 字符串 --> long型 |
| stoll() | 字符串 --> long long型 |
本文介绍了如何使用C++编程语言将IP地址从点分十进制形式转换为二进制表示的10进制数,并演示了如何进行反向转换。主要涉及字符串转数字和256进制转换的函数如stoi和stoll。
4846

被折叠的 条评论
为什么被折叠?



