题解 | 合法IP
合法IP
https://www.nowcoder.com/practice/995b8a548827494699dc38c3e2a54ee9
#include <iostream> #include <sstream> #include <string> using namespace std; bool range(int a){ return a >= 0 && a <= 255; } bool seqi(string s, int i){ // string equal to int if(to_string(i) == s) return true; return false; } bool check(string& s){ // 排除非数字和.的问题 int dotcnt = 0; for(auto elem : s){ if(elem == '.'){ dotcnt++; } else if(!(elem >= '0' && elem <= '9')){ return false; } } // .个数不为3,那么格式一定是错的 if(dotcnt != 3) { return false; } // 判断三个.是否处在正确的位置 if(s[0] == '.'){ return false; } // 第一个字符一定是数字 for(int i = 2; i < s.length(); ++i){ if(s[i] == '.' && s[i-1] == '.'){ return false; } } // .之间一定隔着数字 // 且三个.隔开了四个数字 // 再判断数字的问题 for(auto& elem : s) if(elem == '.') elem = ' '; string s1,s2; s1 = s2 = s; istringstream iss(s1); istringstream iss2(s2); string sn1,sn2,sn3,sn4; int n1,n2,n3,n4; iss >> sn1 >> sn2 >> sn3 >> sn4; iss.str(s2); iss2 >> n1 >> n2 >> n3 >> n4; if(!seqi(sn1,n1) || !seqi(sn2,n2) || !seqi(sn3,n3) || !seqi(sn4,n4)) return false; if(range(n1) && range(n2) && range(n3) && range(n4)) return true; return false; } int main() { string s; while(cin >> s){ if(!check(s)) // 非法ip cout << "NO" << endl; else cout << "YES" << endl; } return 0; }