今天做到Calix(南京凯易迅)的笔试题,其中有一题大致意思是:vector<string>
中存有string字符串,识别每一个字符串是否是ip地址,三种可能:IPv4、IPv6、Neither,将每个字符串的识别结果依次存入一个vector<string>
中返回。
编写函数:vector<string> checkIP(vector<string> &ip_array{ }
如:
输入:
This is not an ip_address!
192.168.1.1
0000: 0123: ff00: 00: ff: 0: 00ff: 1111
输出:
3
Neither
IPv4
IPv6
输入:
192.168.1.1
输出:
1
IPv4
思路如下:
1)首先区分IPv4和IPv6,IPv4是通过4段32bits表示出来,每一段对应8bits,十进制范围为0~255,每一段用点”.”隔开;
IPv6是通过8段128bits表示出来的,每一段对应16bits,十六进制范围为0000~ffff,每一段用冒号”:”隔开。
2)根据段数可以确认可能是IPv4还是IPv6,但只是可能,因为每一段的表示都要进行合法性检测:如256.168.1.1就是不合法的表示,而gg00显然也不能表示十六进制数。那问题来了,如何进行ip_address的每一段检查呢,很遗憾C++标准库里面没有字符分割函数split(),只有我们可以自己创造了:代码如下
#include<iostream>
#include<vector>
#include<string>
using namespace std;
//***函数名:str_split
//***str:待分隔的字符串
//***sign:分隔符,如"."、":"等
//***results:将每一段存入results中,特别的当不存在sign时,str整体存入results中
void str_split(const string &str, const string &sign, vector<