-->
当前位置:首页 > 题库

编程题:IPv4解析(parse_ipv4)

Luz4年前 (2022-04-15)题库991
IPv4地址在机器内部用**32位无符号数**保存。为便于交流,人们通常用“点分十进制”书写IPv4地址:

- 32位无符号数**从高位到低位**分为4个字节:B3 B2 B1 B0,左边高位、右边低位。
- **由低字节到高字节**依次写出其十进制数值。
- 每字节无符号数的范围是[0, 256),所以每段最长3位数字。注意是左闭右开区间。
- 各段不能有多余的前缀0(否则就应按八进制解析,本题不接受这种情况)
- 各段之间用小数点.分隔,格式类似B0.B1.B2.B3。
- 这里反转的原因是网络相关参数通常使用**大端序big-endian**,而我们的电脑使用**小端序little-endian**。

现在需要读入字符串,检查是否为允许的IPv4地址形式,如是则转换成网络参数所需的uint32_t形式。
约需60行代码。本题不考察性能,也可用正则表达式做。

代码框架如下:

cpp
#include <cstdint> // 声明uint32_t
#include <iomanip>
#include <iostream>
using namespace std;

bool parse_ipv4(const string &s, uint32_t& ip){
return false; // 修改本函数,成功返回true,否则返回false。
}

int main(){
for(string s; getline(cin, s);){
cout << s << ": ";
uint32_t ip = 0;
if(parse_ipv4(s, ip)){
cout << ip << '\n';
}else{
cout << "invalid\n";
}
}
cout << flush;
}


先导题目:字节序。

#### 输入规格

每行一个字符串,整行读入并处理,直到EOF为止。

#### 输出规格

每行一条处理结果。如果输入的源串s格式:

- 有效,输出s: ip值。
- 无效,输出s: invalid。

#### 样例输入

in
127.0.0.1
1.2.3.4
hello, world


#### 样例输出

out
127.0.0.1: 16777343
1.2.3.4: 67305985
hello, world: invalid


#### 样例解释

- 第1行格式有效,127在最低字节,1在最高字节,中间两字节为空。
- 第2行格式有效,uint32_t从低到高的4个字节值分别为1、2、3、4,使用位运算或乘法可计算。
- 第3行格式无效,按规格要求输出。不允许无效字符、多余字符、过大的数值。

#### 参考思路(卡住再看)

- 检查字符:只允许数字和小数点。
- 找出所有小数点的位置,应恰好有3处
- 尝试找前4处小数点,前3次必须成功,第4次必须失败。
- 根据小数点把字符串分成4节。检查各节:
- 长度1~3字符。
- 不能有多余的前缀0。
- 转换出4个整数值,应在[0, 255]范围内。
- 以大端序(big-endian)合成uint32_t。





答案:若无答案欢迎评论