使用inet_pton转换文本文件IP地址返回0无法生效问题求助
问题排查及解决
你代码的核心问题有以下几点:
inet_pton的调用逻辑写在了while(fgets(...))循环外部,循环会把整个文件的所有行全部读完才会执行一次地址转换逻辑,此时line变量要么存储的是文件最后一行的内容,要么读到文件EOF后内容未定义,自然无法正常解析fgets读取每行内容时会自动把行尾的换行符\n写入目标缓冲区,带换行符的IP字符串不符合inet_pton的入参格式要求,会被判定为非法地址返回0- 缺少
fopen返回值判空逻辑,若文件路径错误、权限不足导致打开失败,后续操作都会出现异常 - 未校验
line读取到的内容是否合法,直接传入转换函数容易出现不可预期的问题
修正后的参考代码
#include <stdio.h> #include <arpa/inet.h> #include <string.h> int main() { char line[16]; // IPv4最长15字符+结束符,足够容纳 struct in_addr a; FILE *whitelist = fopen("/home/...../whitlist.txt","r"); // 先判断文件是否打开成功 if (whitelist == NULL) { perror("fopen failed"); return -1; } while(fgets(line, sizeof(line), whitelist) ) { // 去掉行尾的换行符 line[strcspn(line, "\n")] = '\0'; printf("当前读取IP:%s\n", line); // 转换逻辑放在循环内部,每读一行处理一行 if(inet_pton(AF_INET, line, &a) == 1){ printf("转换成功\n"); } else if(inet_pton(AF_INET, line, &a) == 0){ printf("非法IP地址格式\n"); } else { perror("inet_pton执行出错"); } } fclose(whitelist); return 0; }
内容的提问来源于stack exchange,提问作者my3589
相关产品推荐
相关产品推荐

