输入一个IP地址字符串(支持16进制和10进制),判断ip是否合法———C语言实现

1.输入一个IP地址字符串(支持16进制和10进制),判断ip是否合法,例如ip为“192.1.0.1”返回ture,ip为“266.266.266.1”,返回false。

程序思路

1、要把ip地址分隔开,当然是用“.”分割。
2、ip地址有十进制和16进制,该如何兼容,先判断是否是16进制,如果是,则转换成整型,如果不是,直接转换为整型
3、再进行判断是否在0-255之间,是否是4个数

部分程序解释

一、.分割字符串

	//1.分割字符串
		p = strtok(str1, split);

解释:
char* strtok (char* str,constchar* delimiters );
函数功能:
  切割字符串,将str切分成一个个子串
函数参数:
  str:在第一次被调用的时间str是传入需要被切割字符串的首地址;在后面调用的时间传入NULL。
 delimiters:表示切割字符串(字符串中每个字符都会 当作分割符)。
函数返回值:
当s中的字符查找到末尾时,返回NULL;
如果查不到delimiter所标示的字符,则返回当前strtok的字符串的指针。

二、

// 2、字符串为16进制,转换为十进制
				/* strtol converts string to long integer */
				num = strtol(p, NULL, 16);

他的作用就是把,字符串转为长整型

long int strtol(const char *nptr,char **endptr,int base);

这个是函数原型,nptr就是我们的字符串,endptr是结束符(NULL就是\0),base是进制数,默认的0(10进制)

整体工程代码

程序代码如下

//程序代码如下
//```
#include "stdafx.h"
#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>




//检查字符是否是在16进制字母中
static  int  isString_Hex(char *p)
{

	int  ret = 0;
	if (p == NULL)
	{
		ret = 0;
	}
	else
	{

		while (*p)
		{

			if (((*p >= 'a') && (*p <= 'f')) || ((*p >= 'A') && (*p <= 'F')))
			{
				ret = 1;
				break;
			}
			else
			{
				ret = 0;
			}
			p++;
		}
	}


	return ret;

}


/***
***:checkIP
***Function:判断ip地址是否合法
***Input:  str   IP地址
***Output: TRUE 合法
FALSE 不合法
****/
int  checkIP(const  char * str)
{
	//const char * str 表示其指针所指向的内容是只读的,不能被修改
	//ip地址默认采用IPv4的点分十进制法,合法地址为0.0.0.0-255.255.255.255
	int  ret = 0;
	const char * split = ".";
	char *str1;
	char * p;
	int  seg_num = 0;
	int  ip[10] = { 0 };
	long  num = 0;
	int i = 0;
	int correct = 0;



	/*
	char* strtok (char* str,constchar* delimiters );
	函数功能:
	  切割字符串,将str切分成一个个子串
	  函数参数:
	    str:在第一次被调用的时间str是传入需要被切割字符串的首地址;在后面调用的时间传入NULL。
		 delimiters:表示切割字符串(字符串中每个字符都会 当作分割符)。
		 函数返回值:
		 当s中的字符查找到末尾时,返回NULL;
		 如果查不到delimiter所标示的字符,则返回当前strtok的字符串的指针。
		 */

	if (str == NULL)
	{
		printf("str is null\n");
		ret = 0;
	}
	else
	{
		str1 = (char*)malloc(strlen(str) + 1);
		strcpy(str1, str);
		//1.分割字符串
		p = strtok(str1, split);
		while (p != NULL) {

			//2.判断字符串是否为16进制,若为16进制返回10进制,否则直接转换为整型
			if (isString_Hex(p))
			{
				//字符串为16进制,转换为十进制
				/* strtol converts string to long integer */
				num = strtol(p, NULL, 16);


			}
			else
			{
				//字符串为10进制
				num = strtol(p, NULL, 10);
			}
			printf("p:%s		", p);
			ip[seg_num] = num;
			printf("ip[seg_num]=%ld\n", ip[seg_num]);
			seg_num++;
			p = strtok(NULL, split);

		}

		if (seg_num == 4)
		{
			for (i = 0; i < seg_num; i++)
			{
				if ((ip[i] >= 0) && (ip[i] <= 255))
					correct++;
			}
			if (correct == 4)
			{
				ret = 1;
			}
			else
			{
				ret = 0;
			}


		}
		else
		{
			ret = 0;
		}

	}

	return ret;
}



int  main()
{

	char str[] = "f.e.a.c";
	int  ret = 0;
	ret = checkIP(str);
	if (ret == 0)
	{
		printf("IP  无效\n");
	}
	else if (ret == 1)
	{
		printf("IP  有效\n");
	}


	printf("hello\n");
	system("pause");
	return  0;
}

运行结果如图:

在这里插入图片描述
在这里插入图片描述

翟羽嚄 CSDN认证博客专家 算法 机器学习 图像处理
我经常会分享一些智能驾驶、自动驾驶、图像识别、嵌入式linux、嵌入式音视频开发等知识,有兴趣的朋友可以关注我的头条号——翟羽镬,ID:1661013377414159,这里会分享一些整理好的且有一定价值的文章和源码。
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页