题解 | #合法IP#
合法IP
https://www.nowcoder.com/practice/995b8a548827494699dc38c3e2a54ee9
#include <stdint.h> #include <stdio.h> #include <string.h> #include <ctype.h> #include <stdlib.h> int HasHeadZeros(char *str); int CheckIfIpAddress(char *addr); int main() { char buf[30] = {0}; scanf("%s", buf); if(CheckIfIpAddress(buf)) { printf("YES\n"); }else { printf("NO\n"); } return 0; } //一些可能的输入和输出:输入保证不含有空格 //192.168.0.1 ---> YES //10.137.17.1---->YES //ab.43.12.4 --->NO 包含字母 //99999.53.23.5---->NO 超过最大 //255.255.255.255--->YES 最大的IP地址,字符串长度 15个,如果超过15个,就不是 //0.0.0.0--->YES 最小的IP地址,字符串长度7个 //$bd.$$$.df.fdd-->NO 包含特殊符号 //""--->NO 空字符串:不睡 //4.3.2 NO 不是,点不够 //57432983# NO 没有., //...434 NO //01.2.3.8 ---->有前导0的情况 //思路 //1. 检查参数是否为空指针。 //2. 检查字符串长度 是否在[7, 15]之间,如果不是,则返回0 //3. 检查.的个数,应该为3,如果不是,则返回0 //4. 按照. 进行分割字符串。设计一个 char addrpart[4][4];(循环查找,遇到.放进里面) //5. 在放的过程中,检查放的是不是数字,并安排一个计数器,放的次数不能超过3. /* *@func:检查输入是否是一个有效ip地址 *@ret:如果是,则返回1, 如果不是,则返回0 */ int CheckIfIpAddress(char *addr) { if(addr == NULL) { return 0; } int pointcnt = 0; int len = strlen(addr); if((len<7) || (len>15)) { return 0; } char addrpart[4][4] = {0}; int numpart[4]; int k=0; for(int i=0; i<len; i++) { if(addr[i] == '.') { pointcnt++; if(pointcnt > 3) { return 0; } k=0; }else if(!isdigit(addr[i])) { return 0; } else { addrpart[pointcnt][k++] = addr[i]; } } for(int i=0; i<4; i++) { if(strlen(addrpart[i]) == 0) { return 0; } else { //排除前导0的情况 if(HasHeadZeros(addrpart[i])) { return 0; } numpart[i] = atoi(addrpart[i]); if(numpart[i] > 255) { return 0; } } } return 1; } int HasHeadZeros(char *str) { int len = strlen(str); if(len==1) { return 0; } if(str[0] == '0') { return 1; } return 0; }