用C语言作答,不要使用sscanf,strtok_r函数 功能:用C语言实现点分IP地址到32比特整数之间的转换 例如:输入字符串“10.10.10.1”,输出168430081。 非法ip地址比如“1234.1.test”返回0
时间: 2024-11-03 11:18:49 浏览: 31
在C语言中,我们可以手动遍历IP地址字符串,并通过ASCII值转换每个部分到十进制,再将其转换为32位二进制数。下面是一个详细的实现:
```c
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h> // 使用inet_addr()函数
uint32_t parse_ip_to_int(const char* ip_str) {
const char delimiter = '.';
size_t len = strlen(ip_str);
if (len < 4 || len > 15) { // 检查IP地址长度是否合法
return 0;
}
uint32_t ip = 0;
for (size_t i = 0; i < 4; ++i) {
char octet[4];
strncpy(octet, ip_str + i * 3, 3); // 截取每一位
octet[3] = '\0'; // 添加终止符
unsigned long value = inet_addr(octet); // 转换为十进制
if (value == INADDR_NONE) { // 非法的数字
return 0;
}
ip <<= 8; // 左移一位
ip |= static_cast<uint32_t>(value & 0xFF); // 或入八位数值
}
return ip;
}
int main() {
char input[] = "10.10.10.1";
uint32_t ip_int = parse_ip_to_int(input);
if (ip_int) {
printf("转换后的32比特整数: %u\n", ip_int);
} else {
printf("非法IP地址,结果为0\n");
}
return 0;
}
```
在这个代码里,我们首先检查IP地址的有效性,然后用`inet_addr()`函数尝试将每个点分的部分转换为十进制,如果失败则返回0(表示非法)。注意,`inet_addr()`仅接受格式正确的点分十进制IP地址。
阅读全文