题目描述
判断IP地址是否合法,N行,以字符串形式输入,格式为a.b.c.d,每个均为整数,输出判断是否为有效ip,每个数均在[0,255]之间。是输出Yes否No
输入样例:
2
1.2.3.4
172.168.0.300
输出:
Yes
No
代码:
#include<iostream>
#include<sstream>
#include<vector>
using namespace std;
void test01()
{
int n;
cin >> n;
cin.ignore();
while (n--)
{
vector<string>v; //存放子串
string s, s1;
getline(cin, s);
for (int i = 0; i < 3; i++)
{
int pos = s.find("."); //查找"."的位置
s1 = s.substr(0, pos); //子串 = 从开头到"."之前
v.push_back(s1); //把子串插入容器v
s.erase(s.begin(), s.begin() + pos + 1); //清除从开头到"."
}
v.push_back(s); //把最后剩余的子符串插入容器v
int num[4]; //存放转成整形的数字
for (int i = 0; i < 4; i++)
{
stringstream ss;//声明流
ss << *(v.begin() + i); //字符串输出流
ss >> num[i]; //输入到数组
}
if (num[0] >= 0 && num[0] <= 255 && num[1] >= 0 && num[1] <= 255 && num[2] >= 0 && num[2] <= 255 && num[3] >= 0 && num[3] <= 255) //判断ip地址是否合法
{
cout << "Yes" << endl;
}
else
{
cout << "No" << endl;
}
}
}
int main()
{
test01();
return 0;
}
结果:
----更新-----
上次写的时候还不知道atoi函数和c_str函数,再记录一种写法
void test02()
{
int n;
cin >> n;
cin.ignore();
while (n--)
{
vector<string>v; //存放子串
string s, s1;
getline(cin, s);
for (int i = 0; i < 3; i++)
{
int pos = s.find("."); //查找"."的位置
s1 = s.substr(0, pos); //子串 = 从开头到"."之前
v.push_back(s1); //把子串插入容器v
s.erase(s.begin(), s.begin() + pos + 1); //清除从开头到"."
}
v.push_back(s); //把最后剩余的子符串插入容器v
int num[4]; //存放转成整形的数字
for (int i = 0; i < 4; i++)
{
num[i] = atoi((*(v.begin()+i)).c_str());
}
if (num[0] >= 0 && num[0] <= 255 && num[1] >= 0 && num[1] <= 255 && num[2] >= 0 && num[2] <= 255 && num[3] >= 0 && num[3] <= 255) //判断ip地址是否合法
{
cout << "Yes" << endl;
}
else
{
cout << "No" << endl;
}
}
}
调用test02()结果和test01()是一样的