inet_addr函数实现

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

// 方法1:使用指针数组实现
unsigned long inet_addr(const char *str)
{
	unsigned long lHost = 0;
	int i = 1, j = 1;
	const char *pstr[4] = { NULL };
	pstr[0] = strchr(str, '.');
	pstr[1] = strchr(pstr[0] + 1, '.');
	pstr[2] = strchr(pstr[1] + 1, '.');
	pstr[3] = strchr(str, '');

	for (j = 0; j < 4; j++)
	{
		i = 1;
		if (j == 0)
		{
			while (str != pstr[0])
			{
				lHost += (*--pstr[j] - '0') * i;
				i *= 10;
			}
		}
		else
		{
			while (*--pstr[j] != '.')
			{
				lHost += (*pstr[j] - '0') * i << 8 * j;
				i *= 10;
			}
		}
	}
	return lHost;
}

// 方法2:使用strchr() + atoi()实现
unsigned long inet_addr2(const char *str)
{
	unsigned long lHost = 0;
	char *pLong = (char *)&lHost;
	char *p = (char *)str;
	while (p)
	{
		*pLong++ = atoi(p);
		p = strchr(p, '.');
		if (p)
			++p;
	}
	return lHost;
}

// 方法3:使用strtok()函数,对字符串进行切割
unsigned long inet_addr3(const char *str)
{
	unsigned long lHost = 0;
	char *pLong = (char *)&lHost;
	char substr[20] = { 0 };
	strncpy(substr, str, sizeof(substr));
	char *p = strtok(substr, ".");
	while (p != NULL)
	{
		*pLong++ = atoi(p);
		p = strtok(NULL, "."); // 获取下一个片段
	}

	return lHost;
}

// 方法4:使用联合体实现
union CUnion
{
	unsigned long lHost;
	unsigned short sHost[2];
	unsigned char cHost[4];
};

unsigned inet_addr4(const char *str)
{
	CUnion u;
	int i = 0;
	char *p = (char *)str;

	while (p)
	{
		u.cHost[i++] = atoi(p);
		p = strchr(p, '.');
		if (p)
			++p;
	}
	return u.lHost;
}

int main()
{
	char str[20] = { '' };
	while (true)
	{
		printf("请输入需要转换的IP地址:");
		scanf_s("%s", str, sizeof(str));
		unsigned long addr = inet_addr4(str);
		printf("%s 转换后:0x%x
", str, addr);
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/veis/p/12587248.html