编程题:IPv4解析(parse_ipv4)
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段。每段都不能为空、不能有多余的前缀0。
- 转换出4个整数值,应在[0, 255]范围内。
- 以大端序(big-endian)合成uint32_t。
答案:若无答案欢迎评论
- 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段。每段都不能为空、不能有多余的前缀0。
- 转换出4个整数值,应在[0, 255]范围内。
- 以大端序(big-endian)合成uint32_t。
答案:若无答案欢迎评论