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