题解 | #合法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;
}


全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务