#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; }