首页 > 试题广场 >

合法IP

[编程题]合法IP
  • 热度指数:244842 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

IPV4地址可以用一个32位无符号整数来表示,一般用点分方式来显示,点将IP地址分成4个部分,每个部分为8位,表示成一个无符号整数(因此正号不需要出现),如10.137.17.1,是我们非常熟悉的IP地址,一个IP地址串中没有空格出现(因为要表示成一个32数字)。

现在需要你用程序来判断IP是否合法。

数据范围:数据组数:
进阶:时间复杂度:,空间复杂度:



输入描述:

输入一个ip地址,保证不包含空格



输出描述:

返回判断的结果YES or NO

示例1

输入

255.255.255.1000

输出

NO
好像测试用例中不会有字母或者除了'.'之外的特殊字符,不知道题目哪里说明和体现了这点?好像只是说了确保输入没有空格而已
发表于 2024-05-27 01:23:43 回复(0)
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    char str[20] = {'\0'} ;
    char t_str[10] = {'\0'};
    int subscript = 0;
    int n = 0;
    bool format = true;
    bool num_range = true;
    int nn = 0;
    gets(str);
    //检查格式是否正确
    for (int i = 0 ; i < strlen(str) ; i++) {
        if (str[i] == '.') {
            //遇到'.'则前后都要是数组
            if (!(str[i - 1] >= '0' && str[i - 1] <= '9' && str[i + 1] >= '0' &&
                    str[i + 1] <= '9')) {
                format = false;
            }
            //遇到'.0'且后一位在1到9之间
            else if (str[i] == '.' && str[i + 1] == '0') {
                if (str[i + 2] > '0' && str[i + 2] <= '9') {
                    format = false;
                }
            }

        }//遇到'0'且后一位在1到9之间
        else if (str[i] == '0' && i == 0) {
            if (str[i + 1] > '0' && str[i + 1] <= '9') {
                format = false;
            }
        }
        else if (str[i] < '0' || str[i] > '9') {
            format = false;
        }
    }

    //判断数字范围是否正确
    for (int i = 0 ; i < strlen(str) + 1; i++ ) {
        if (str[i] == '.' || str[i] == '\0') {
            nn++;
            n = atoi(t_str);
            if (n < 0 || n > 255) {
                num_range = false;
                break;
            }
            n = 0;
            memset(t_str, '\0', 10);
            subscript = 0;
        } else if (str[i] >= '0' && str[i] <= '9') {
            t_str[subscript++] = str[i];
        }
    }
    //printf("%d %d %d\n", format, num_range, nn);
    if (format == true && num_range == true && nn == 4)   printf("YES\n");
    else printf("NO\n");
    return 0;
}

编辑于 2023-12-27 11:17:17 回复(0)
#include <stdio.h>

int main()
{
    char str[100]={0};
    int ip[10]={0};

    while(scanf("%s",str)!=EOF)
    {
        int flag=1;
        if(str[0]=='0' && str[1]!='.') flag=0;        //第一段数字前带0
        int i=0;
        int count=0;
        while(i<strlen(str))           
        {
            if(str[i]=='.')                 //记录'.'字符出现的次数
            {
                count++;
            }
            //数字前带0的情况
            if(str[i]=='.' && str[i+1]=='0' && str[i+2]!='.' && str[i+2]!='\0')
            {
                flag=0;
                break;
            }
            //输入只能含有数字和字符'.'
            if(!(str[i]>='0' && str[i]<='9' || str[i]=='.'))
            {
                flag=0;
                break;
            }
            i++;
        }
        if(count!=3) flag=0;         //只能含有三个字符'.'
        //记录字符串中数字的段数
        int n=sscanf(str,"%d.%d.%d.%d",&ip[0],&ip[1],&ip[2],&ip[3]);
        if(n==4)                     //段数为4
        {
            for(int i=0;i<4;i++)
            {
                if(ip[i]<0 || ip[i]>255)
                {
                    flag=0;
                    break;
                }
            }
        }
        else flag=0;
        if(flag==1) printf("YES\n");
        else if(flag==0) printf("NO\n");
    }
    
    return 0;
}

发表于 2023-11-30 03:15:24 回复(0)
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int cnt = 0;
    int flag = 1;
    char s[100] = {0};
    char ipStr[10] = {0};
    int bitIpStr = 0;
    int temp = 0;
    scanf("%s", s);
    for(int i = 0; i < strlen(s); i++){
        if(s[i] >= '0' && s[i] <= '9'){
            ipStr[bitIpStr++] = s[i];
        }else if(s[i] == '.' && bitIpStr > 0){
            if(bitIpStr >= 2 && ipStr[0] == '0'){
                flag = 0;
                break;
            }
            ipStr[bitIpStr++] = 0;
            temp = atoi(ipStr);
            if(temp > 255){
                flag = 0;
                break;
            }
            bitIpStr = 0;
            cnt++;
        }else{
            flag = 0;
            break;
        }
    }
    if(bitIpStr > 0){
        ipStr[bitIpStr++] = 0;
        temp = atoi(ipStr);
        if(temp <= 255 && bitIpStr > 0 && !(bitIpStr >= 3 && ipStr[0] == '0')){
            cnt++;
        }
    }
    if(cnt == 4 && flag == 1){
        printf("YES\n");
    }else{
        printf("NO\n");
    }
    return 0;
}

发表于 2023-11-05 17:19:41 回复(0)
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main() {
    char str[19] = {'\0'};
    scanf("%s",str);
    int len = strlen(str);
    int flag = 0;
    int tmp = 0;
    int num = 0;
    int n = 0;
    for(int i = 0;i<len;i++)
    {
        if(isdigit(str[i])||str[i] == '.')
        {
            if(isdigit(str[i]))
            {
                if(flag == 0)
                {
                    flag = 1;
                    tmp = 0;
                    num = 0;
                }
                tmp++;
                num = num*10 + str[i] - '0';
            }
            else
            {
                if(flag == 1)
                {
                    flag = 0;
                    n++;
                }
                if((tmp>1&&num<10)||(tmp == 3&&num>9&&num<100)||num>255)
                {
                    printf("NO\n");
                    flag = -1;
                    break;
                }
            }
        }
        else
        {
            printf("NO\n");
            flag = -1;
            break;
        }
    }
    if(flag != -1)
    {
        if(n!=3)
        {
            printf("NO\n");
        }
        else
        {
            if(flag == 0)
            {
                printf("NO\n");
            }
            else
            {
               if((tmp>1&&num<10)||(tmp == 3&&num>9&&num<100)||num>255)
                {
                    printf("NO\n");
                }
                else
                {
                    printf("YES\n");
                }
            }
        }
    }
}
发表于 2023-10-23 15:14:06 回复(0)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    
    char buf[20];
    scanf("%s",buf);

    int dot = 0;
    char *p=buf, *last=buf;
    char tmp[5];

    while(*p != '\0') {
        if((*p) - '0' >= 0 && (*p) -'0' <= 9 || (*p) == '.'){
            if(*p == '.') {
                if(dot >= 3) {
                    goto err;
                }
                dot++;
                if((p-last)/sizeof(char) > 3)
                    goto err;
                if(p == last)
                    goto err;
                if(*last == '0' && (p-last)/sizeof(char) != 1) {
                    // puts("ignore 0\n");
                    goto err;
                }
                strncpy(tmp,last,(p-last)/sizeof(char));
                tmp[(p-last)/sizeof(char)] = '\0';
                if(atoi(tmp) > 255) {
                    // printf("%d\n",atoi(tmp));
                    // puts(">255");
                    goto err;
                }
                last = p+1;
            }
            p++;
        } else {
            // puts("illegal char\n");
            goto err;
        }
    }
    if(*last == '0' && (p-last)/sizeof(char) != 1) {
        // puts("ignore 0\n");
        goto err;
    }
    if((p - last + 1)/sizeof(char) <= 1) {
        // puts("4th sector error\n");
        goto err;
    }
    strncpy(tmp,last,(p-last)/sizeof(char));
    tmp[(p-last)/sizeof(char)] = '\0';
    if(atoi(tmp) > 255) {
        // printf("%d\n",atoi(tmp));
        // puts(">255");
        goto err;
    }

    if(dot != 3){
        // puts("dot != 3\n");
        goto err;
    }

    printf("YES");

    return 0;

err:
    printf("NO\n");
    exit(0);

}

发表于 2023-05-05 20:38:21 回复(0)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

int main() {
    char str1[40] = { 0 };
    char str[40] = { 0 };
    int i = 0;
    while (scanf("%s", str1) != EOF) {
        if (strlen(str1) < 7) {
            printf("NO\n");
            return 0;
        }
        if (str1[0] == '0' && isdigit(str1[1]) || !isdigit(str1[0])) {
            printf("NO\n");
            return 0;
        }
        for (int i = 1; i < strlen(str1); i++) {
            if (!isdigit(str1[i]) && str1[i] != '.') {
                printf("NO\n");
                return 0;
            }
            if (str1[i] == '0' && isdigit(str1[i + 1]) && str1[i - 1] == '.') {
                printf("NO");
                return 0;
            }
        }

        char* p = NULL;

        for (p = strtok(str1, "."); p != NULL; p = strtok(NULL, ".")) {
            i++;
            int num = atoi(p);
            if (num > 256 || num < 0) {
                printf("NO\n");
                return 0;
            }
        }

    }
    if (i > 4) {
        printf("NO\n");
        return 0;
    }
    printf("YES\n");
    return 0;
}
一开始过了二十多个用例,后面一直调试调试,终于全部通过了。

发表于 2023-03-21 17:32:34 回复(0)
#include <stdio.h>
#include <string.h>

#define MAX 19

int main() {
    char ip[MAX];
    scanf("%s", ip);
    int ip_len = strlen(ip);
    int flag = 0;//合法标志位,用来判断用‘.’间隔的4个数字部分的每个部分是否合法,合法flag就加一,4个部分都合法(即flag==4),才会输出“YES”
    
    for (int i=0; i<ip_len; i++) {
        if (i==0 || ip[i-1]=='.') {//表示字符串字符数值部分开始
            int num = 0;//记录把字符串字符数值转换为整型数值的值
            int count = 0;//记录字符串中数字部分的长度
            if (ip[i]>='0' && ip[i]<='9') {
                //不满足下面while的循环条件表示字符串字符数值部分的结束
                while (ip[i+count] != '.' && (i+count) != ip_len) {
                    count++;
                }
                if (count > 3) {//长度大于3表示不合法,直接结束循环
                    break;
                }
                else {
                    /*长度是2或者3时,并且第一个字符数值为“0”时,
                    表明不合法,直接结束循环*/
                    if (count > 1 && ip[i] == '0') {
                        break;
                    }
                    for (int j=i; j<count+i; j++) {//把字符数值转换为整型数值
                        int num_j = ip[j] - '0';
                        num *= 10;
                        num += num_j;
                    }
                    if (num>255) {//数值大于255不合法,结束循环
                        break;
                    }
                    else {//合法情况,flag加一
                        flag++;
                    }
                }
            }
            else {//是非数值字符,表明不合法,结束循环
                break;
            }
        }
    }
    if (flag == 4) {
        printf("YES\n");
    }
    else {
        printf("NO\n");
    }

    return 0;
}

发表于 2023-03-09 11:08:19 回复(0)
//目前38个测试用例全部通过了
#include <stdio.h>
#include <string.h>
int main()
{
    int i = 1;
    int flag = 0;
    char ch,str[20] = {0};
    char *ptr,c = '.';
    str[0] = '.';
    while ((ch = getchar()) != '\n')
    {
        str[i++] = ch;
    }
    if (i > 16 || i < 8)
    {
        printf("NO");
        return 0;
    }
    while(ptr=strrchr(str,c))
    {
        //针对01.1.2.8    1.01.3.4等情况的特殊处理
        if (atoi(ptr+1) > 255 || atoi(ptr + 1) < 0 ||
           (strlen(ptr+1)) > 1 && (9 > atoi(ptr+1) > 0))
        {
            printf("NO");
            return 0;
        }
        *ptr='\0';
        flag++;
    }
    if (flag != 4)
    {
        printf("NO");
        return 0;
    }
    printf("YES");
    return 0;
}

发表于 2022-05-26 00:15:41 回复(0)
c正则表达式版本,学艺不精,感觉正则表达式应该还可以优化
/*
思路:分别对250-255, 200-249, 100-199, 10-99, 0-9 匹配得出数字部分
     加上小数点,重复三次
     最后再补上一次
*/
#include <stdio.h>
#include <regex.h>

int main(void)
{
    char in[50];
    regex_t reg;
    char* pattern = "^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$";
    int status;
    
    int ret;
    ret = regcomp(&reg, pattern, REG_EXTENDED | REG_NOSUB);
    
    while(scanf("%s", in) != EOF){
        status = regexec(&reg, in, 0, 0, 0);
        if( 0 == status){
            printf("YES\n");
        }else{
            printf("NO\n");
        }
    }
        
    regfree(&reg);
    return 0;
}


发表于 2022-01-23 17:40:02 回复(1)
/***不解为何这一点代码会用超了32M内存***/
#include <stdio.h>
#include <string.h>

int main(void)
{
    int input[4] = {0};

    while(scanf("%d.%d.%d.%d",&input[0],&input[1],&input[2],&input[3]) != EOF)
    {
        int flag = 1;
        int i = 0;
        for(i = 0;i < 4;i++)
        {
            if(input[i] > 255 || input[i] < 0)     flag = 0;    
        }
        if(flag) printf("%s\n","YES");
        else printf("%s\n","NO");
        
    }
    return 0;
    
}

发表于 2021-12-05 16:19:51 回复(1)
#include<stdio.h>
#include<stdlib.h>
int main()
{
    char arra[100]={0};
    memset(arra,0,100);
    while(scanf("%s",arra)!=EOF)
    {
        int len =0;
        char *p=arra;
        char *take = NULL;
        int num =0;
        while((take= strtok(p,"."))!= NULL)
        {
            len++;
            sscanf(take,"%d",&num);
            if(!(num <=255&&num>=0) || len>4)
            {
                break;
            }
            p=NULL;
        }
        if(!(num <=255&&num>=0) || len>4)
                printf("NO\n");
        else if(len == 4)
        {
                printf("YES\n");
        }
        len =0;
        memset(arra,0,100);
    }
    return 0;
}
发表于 2021-10-04 14:25:38 回复(0)

练习一下对字符串进行操作

#include<stdio.h>
// 拆分字符串
int split(char in[50], char **sub) {
    char *p = in;
    char key[2] = ".";
    int num = 0;
    p = strtok(in, key);
    while(p != NULL) {
        sub[num++] = p;
        p = strtok(NULL, key);
    }
    return num++;
}
// 判断每组数字是否合法
int isOK(char IP[10]) {
    int a = atoi(IP);
    if(a < 0 || a > 255){
        return 0;
    }
    return 1;
}
int main() {
    char in[50] = {0};
    while(gets(in)) {
        char *sub[10];
        int num = split(in, sub);
        int ret = 1;
        for(int i = 0; i < num; i++) {
            ret &= isOK(sub[i]);
        }
        if(ret == 1) {
            printf("YES\n");
        } else {
            printf("NO\n");
        }
    }
}
发表于 2021-08-31 19:50:18 回复(0)
#include "stdio.h"
int main(void){
    int a,b,c,d;
    while(scanf("%d.%d.%d.%d",&a,&b,&c,&d)!=EOF){
        if(a>=0&&a<=255&&b>=0&&b<=255&&c>=0&&c<=255&&d>=0&&d<=255){
            printf("YES\n");
        }else{
            printf("NO\n");
        }
        }
}
发表于 2021-08-28 00:05:50 回复(0)