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;
}
运行结果如图: