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, '\0');

	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] = { '\0' };
	while (true)
	{
		printf("请输入需要转换的IP地址:");
		scanf_s("%s", str, sizeof(str));
		unsigned long addr = inet_addr4(str);
		printf("%s 转换后:0x%x\n", str, addr);
	}
	return 0;
}

  


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM