题解 | #合法IP#
合法IP
https://www.nowcoder.com/practice/995b8a548827494699dc38c3e2a54ee9
题目描述不太清楚,有很多非法情况一开始没考虑到,通过一步步调试,最终覆盖所有情况
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAX_STR_LEN 18
static int IsGoodIp(char *str, int len)
{
int flag = 0;
int num = 0;
//printf("len:%d\n",len);
/* 过滤大于4位数和连续点的情况 */
if (len > 3 || len < 1) {
return 0;
}
/* 过滤0xx.0xx.0xx.0xx 的情况 */
if (len > 1 && str[0] == '0') {
return 0;
}
for (int i = 0; i < len; i++) {
/* 过滤非数字的情况 */
if (!isdigit(str[i])) {
return 0;
}
/* 得出ip值 */
num = num * 10 + str[i] - '0';
}
//printf("num:%d\n", num);
/* 过滤3位数大于255的情况 */
if (num > 255) {
return 0;
}
return 1;
}
int main(void)
{
char str[MAX_STR_LEN] = {0};
int strLen;
int left = 0;
int right = 0;
int flag = 0;
int ipCnt = 0;
scanf("%s", str);
strLen = strlen(str);
//printf("strlen:%d\n", strLen);
for (right = 0; right < strLen; right++) {
/* 分段解析 */
if (str[right] == '.' || right == (strLen - 1)) {
if (right == 0) {
printf("NO\n");
return 0;
}
if (right == (strLen - 1)) {
flag = IsGoodIp(&str[left], right - left + 1);
} else {
flag = IsGoodIp(&str[left], right - left);
}
//printf("flag:%d\n", flag);
left = right + 1;
if (flag == 0) {
printf("NO\n");
return 0;
} else {
ipCnt++;
}
}
}
if (ipCnt == 4) {
printf("YES\n");
} else {
printf("NO\n");
}
return 0;
}
查看9道真题和解析