【C语言】从字符串中提取IP地址最简洁的方法

本文介绍了一种使用C语言实现的IPv4地址验证及从复杂字符串中提取IPv4地址的方法。首先通过sscanf函数解析字符串并检查各部分是否符合IPv4标准,接着遍历输入字符串寻找合法的IPv4地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先先看一下判断字符串是否为IP地址(IPv4地址是否合法)的方法:
【C语言】判断字符串是否为IP地址(IPv4地址是否合法)

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

/**
 * @brief 判断IPv4地址是否合法
 * @param ip: 待校验的ip地址
 * @return true: 校验成功	false:校验失败(IP地址不合法)
 * @author PJW
 */
bool IPv4_verify(char *ip) {
    int a,b,c,d;
    char t;

	if (4 == sscanf(ip,"%d.%d.%d.%d%c",&a,&b,&c,&d,&t)){
        if (0<=a && a<=255
            && 0<=b && b<=255
            && 0<=c && c<=255
            && 0<=d && d<=255) {
			return true;
        }
    }
	return false;
}

void main() {
    char ip[50]="192.1.2.3.4567";
    // char ip[50]="192.1.2.3";
    
    bool res = IPv4_verify(ip);
	if(true == res){
		printf("[%s] is valid IPv4\n", ip);
	}else{
		printf("[%s] is invalid IPv4\n", ip);
	}
}

执行结果:
在这里插入图片描述
在这里插入图片描述


然后根据以上方法,修改为从一个复杂的字符串中提取出IPv4地址:

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

/**
 * @brief IPv4地址提取
 * @param str: 待提取的字符串
 * @param len: 待提取的字符串长度
 * @param out_ip: 提取到的 IPv4 地址
 * @return true: 提取成功	
 * 			false:提取失败(IP地址不存在或不合法)
 * @author PJW
 * @date 2021/07/01
 */
bool IPv4_GET(char *str,int len,char *out_ip) {
	int a,b,c,d;
	char *p = str;
	
	for(int i=0;i<len;i++){
		if((*p >= '0')&&(*p <= '9')){
			if(4 == sscanf(p,"%d.%d.%d.%d",&a,&b,&c,&d)){
				if (0<=a && a<=255
					&& 0<=b && b<=255
					&& 0<=c && c<=255
					&& 0<=d && d<=255) {
					sprintf(out_ip,"%d.%d.%d.%d\n",a,b,c,d);
					// printf("IPv4: %d.%d.%d.%d\n",a,b,c,d);	
					return true;
				}
			}
		}
		p++;
	}
	return false;
}

void main() {
    char str[50]="+QIACT: 1,1,1,\"10.5.110.126\"";
    char ip[16]={0};
		
    bool res = IPv4_GET(str, strlen(str), ip);
	if(true == res){
		printf("Get a valid IPv4 address: %s\n", ip);
	}else{
		printf("No valid IPv4 address was obtained\n");
	}
}

执行结果:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值