写这篇博客的缘由在于自己在判断IP地址的合法性上吃了几次考虑不周全的亏。
算是引以为戒吧。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
bool change2Binary(const string &str) {
/* 判断IP地址的合法性1
1. 有不合法字符
2. 点号数量不等于3
3. 点号在头尾,或者点号相邻。
*/
string judge = ".0123456789";
int cnt = 0;
int dots[3] = {0};
for(unsigned i = 0; i < str.size(); ++i) {
if(str[i] == '.') {
if(cnt >= 3) return false;
dots[cnt++] = i;
}
if(judge.find(str[i]) == -1) return false;
}
if(cnt != 3 || str[0] == '.' || str[str.size() - 1] == '.'
|| dots[1] - dots[0] < 2 || dots[2] - dots[1] < 2)
return false;
/* 将IP地址由 . 分隔的四个字段存入四个int变量中。 */
int arrInt[4] = { 0 };
unsigned k = 0;
for (int i = 0; i < 4; ++i) {
while (str[k] != '.' && k < str.size()) {
arrInt[i] = arrInt[i] * 10 + str[k++] - '0';
}
++k;
}
/* 判断IP地址的合法性2 */
for (int i : arrInt) {
if (i < 0 || i > 255) return false;
}
/* 将十进制数转换成二进制数输出 */
for (int i = 0; i < 4; ++i) {
int tmp = arrInt[i];
vector<int> vecBin(8, 0);
for (unsigned j = 0; tmp != 0; ++j) {
vecBin[j] = tmp % 2;
tmp /= 2;
}
for (auto iter = vecBin.crbegin(); iter != vecBin.crend(); ++iter)
cout << *iter;
}
return true;
}
int main(void) {
string str;
cin >> str;
if (!change2Binary(str))
cout << "data error" << endl;
return 0;
}
/* 测试数据
.12.12.12
0.1.1.1.
1..2.2234
sd.12j12lj
11001010100101110110000000100001
11001010100101110110000000100001
*/