C++ 从任意字符串中提前ip信息

本文介绍了一种从字符串中解析IPv4地址的方法。通过遍历输入字符串,该方法检查是否符合IPv4地址的标准格式,包括四个由点分隔、取值范围在0到255之间的数字段。

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

#define RE_ERR 0
#define RE_OK 1

void getHostIP(char* hostIP,const char* sourceStr)
{
	char nbuf[4];
	int sn[4];
	int i,ret,start,n,m;
	int runnum=0;
	start = 0; 

	while (1)
	{  
		runnum++;
		//第一个数大于255的情况
		if (runnum > 1)
		{
			ret=RE_ERR;
			for (i=start+1;i<strlen(sourceStr);i++)
			{
				if (sourceStr[i]<'1' || sourceStr[i]>'9')
				{
					start = i;
					ret=RE_OK;
					break;
				}
			}

			if(ret==RE_ERR)
			{
				break;
			}
		}  

		//查找第一个数为数字的 
		ret=RE_ERR;
		for (i=start;i<strlen(sourceStr);i++)
		{
			if (sourceStr[i]>='1' && sourceStr[i]<='9')
			{
				start = i;
				ret=RE_OK;
				break;
			}
		}

		if(ret==RE_ERR)
		{
			break;
		}

		//在剩余的字串中是否含有三个点
		n=0;
		for (i=start;i<strlen(sourceStr);i++)
		{
			if (sourceStr[i]=='.')
			{
				n++;
			}
		}

		if (n<3)
		{
			ret = RE_ERR;
			break;
		}


		ret=RE_ERR;
		memset(nbuf,0,sizeof(nbuf));
		for (i=start,m=0,n=0;i<strlen(sourceStr);i++)
		{

			if (sourceStr[i]>='0' && sourceStr[i]<='9')
			{    

				if(n<3)
				{
					nbuf[n]=sourceStr[i];
					ret=RE_OK;
				}
				else
				{
					ret=RE_ERR;
					break;
				}
				n++;
			}
			else if (sourceStr[i]=='.')
			{
				if (strlen(nbuf)==0)
				{
					ret=RE_ERR;
					break;
				}

				sn[m] = atoi(nbuf);
				if (sn[m] <= 255)
				{
					m++;
					n=0;
					memset(nbuf,0,sizeof(nbuf));
					if (m==4)
					{
						ret=RE_OK;
						break;
					}  
				}
				else
				{
					ret=RE_ERR;
					break;

				}
			}
			else
			{
				break;
			}
		}

		if (m==3)
		{
			if (ret==RE_OK)
			{
				if (strlen(nbuf)==0)
				{
					ret=RE_ERR;
				}
				else
				{
					sn[3]=atoi(nbuf);
					if (sn[3] <= 255)
					{
						ret=RE_OK;
					}
					else
					{
						ret=RE_ERR;
					}
				}
			}
		}
		else
		{
			if (m!=4)
			{
				ret=RE_ERR;
			}   
		}

		if (ret==RE_OK)
		{
			break;
		}
		else
		{
			continue;
		}
	}

	if (ret==RE_OK)
	{
		sprintf(hostIP,"%u.%u.%u.%u",sn[0],sn[1],sn[2],sn[3]);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值