linux c 判断字符串是否为ip地址

是这样的,想请说下,linux c 判断字符串是否为ip地址
最新回答
思檀郎

2024-10-30 16:33:17

一般地可以通过正则表达式库进行检测

也可以手动进行检测


常见的ip地址是点分十进制的字符串形式

类似

192.168.1.1

10.2.4.1

这种

四个部分每个部分的最大值是255

所以正则表达式简单点可以是

(\d+\.){3}\d+

但这样并不能完全正确地匹配ip地址

如果所要匹配的文件中确定出现的类似字符串为ip地址的话就完全没有问题

准确点可以

(\d{1,3}\.){3}\d{1,3}

然后再对每个数字进行判断

判断是否超出了ip地址的范围


下面是一个简单的使用正则表达式的代码

#include <stdio.h>
#include <string.h>
#include <pcre.h>

int main(int argc,char **argv)
{
    char *s="192.168.1.1";
    pcre *code;
    int rc;
    int ovector[2*3];
    const char *errptr;
    const char *ip;
    int erroffet;
    char *p;
    char buf[20];

    code=pcre_compile("(\\d{1,3}\\.){3}\\d{1,3}",0,
            &errptr,&erroffet,NULL);

    if((rc=pcre_exec(code,NULL,s,strlen(s),0,0,ovector,2*3)) > 0)
    {
        pcre_get_substring(s,ovector,rc,0,&ip);
        snprintf(buf,20,"%s",ip);
        pcre_free_substring(ip);

        for(p=strtok(buf,".");p != NULL;p=strtok(NULL,"."))
        {
            if(atoi(p) > 255)
                goto end;
        }

        printf("正确ip!\n");
        return 0;
    }

end:
        printf("错误的ip!\n");

    pcre_free(code);

    return 0;
}
我的心脏你的模样

2024-10-30 08:26:12

rep='\d{1,2}|1\d\d|2[0-4]\d|25[0-5]'
x=/^(#{rep})\.(#{rep})\.(#{rep})\.(#{rep})$/
p "ok!" if strTestIP =~ x
暴力萌萌

2024-10-30 13:32:19

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>

int if_a_string_is_a_valid_ipv4_address(const char *str)
{
struct in_addr addr;
int ret;
volatile int local_errno;

errno = 0;
ret = inet_pton(AF_INET, str, &addr);
local_errno = errno;
if (ret > 0)
fprintf(stderr, "\"%s\" is a valid IPv4 address\n", str);
else if (ret < 0)
fprintf(stderr, "EAFNOSUPPORT: %s\n", strerror(local_errno));
else
fprintf(stderr, "\"%s\" is not a valid IPv4 address\n", str);

return ret;
}