编辑代码

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

#define IPV4 "IPv4"
#define IPV6 "IPv6"
#define NEITHER "Neither"
#define False 0
#define True 1

int checkIPV4(char *ip)
{
	int sepNum;
	if(ip[0] == '0' || ip[0] == '.' || strlen(ip) > 3 || strlen(ip) == 0)
		return False;
	sepNum = atoi(ip);
	if(sepNum ==0 || sepNum > 255)
		return False;
	return True;
}

int checkIPV6(char *ip)
{
	int i=0;
	if(ip[0] == ':' || strlen(ip) > 4 || strlen(ip) == 0)
		return False;
	for(i=0;i<strlen(ip);i++)
	{
		if((ip[i] >='0' && ip[i] <='9') || (ip[i] >='a' && ip[i] <='f') || (ip[i] >='A' && ip[i] <='F'))
			continue;
		else
			return False;
	}
	return True;
}

char *solve(char *IP)
{
	if(IP == NULL)
		return NEITHER;
	char *cur,*pre;
	char ip[10] = {0};
	char len = 0;
	if(strchr(IP,'.'))
	{
		pre = IP;
		cur = strchr(IP,'.');    //找到'.'的位置
		while(cur)
		{
			memcpy(ip,pre,cur-pre);    //取出两个'.'之间的字符
			if(checkIPV4(ip) == False)
				return NEITHER;
			pre = cur + 1;
			cur = strchr(pre,'.');
			memset(ip,0,10);
			len++;
			if(len > 3)        //判断分组是否符合ipv4要求
				return NEITHER;
		}
		if(len != 3)
			return NEITHER;
		memcpy(ip,pre,strlen(pre));
		if(checkIPV4(ip) == False)
			return NEITHER;
		return IPV4;
	}
	else if(strchr(IP,':'))
	{
		pre = IP;
		cur = strchr(IP,':');
		while(cur)
		{
			memcpy(ip,pre,cur-pre);
			if(checkIPV6(ip) == False)
				return NEITHER;
			pre = cur + 1;
			cur = strchr(pre,':');
			memset(ip,0,10);
			len++;
			if(len > 7)
				return NEITHER;
		}
		if(len != 7)
			return NEITHER;
		memcpy(ip,pre,strlen(pre));
		if(checkIPV6(ip) == False)
			return NEITHER;
		return IPV6;
	}
}

int main()
{
	printf("%s\n",solve("2001:0db8:85a3:0:0:8A000E:0370:11"));
    printf("%s\n",solve("172.16.254.1"));
    printf("%s\n",solve("172.16.254."));
    printf("%s\n",solve("172..254.1"));
    printf("%s\n",solve("256.256.256.256"));
    printf("%s\n",solve("2001:0db8:95a3:0:0:8A2E:0370:7334"));
    printf("%s\n",solve("02001:0db8:95a3:0:0:8A2E:0370:7334"));
    printf("%s\n",solve("2001:0db8:95a3::0:8A2E:0370:7334"));
    printf("%s\n",solve("2001:0db8:95a3:0:0:8A2E:0370:"));
    printf("%s\n",solve("2001:0db8:95a3:0:0:8A2E:0370:02345"));
}