我正在用 C 语言开发防火墙应用程序。该应用程序将 IP 作为输入的一部分。 IP 可以是独立的,也可以是一个范围,如下所示:
独立版:
x.x.x.x
范围:
x.x.x.x-x.x.x.x
其中 x 是 0 到 255(含)之间的整数
对于范围 IP,我使用
strtok(ip, "-")
首先解析两个 IP,然后调用函数 splitOnDot
使用 "."
作为分隔符来解析 ip,将字符串标记转换为整数并确保 int 位于范围 0-255。
但是,调用
splitOnDot
会导致 strtok(NULL,"-");
返回 null,而不是范围内的第二个 ip。有人可以看到我的错误吗?
---代码---
//Recieves a string with no '-', attempts to split by '.', convert string to integer and validate integers
int splitOnDot(char* ipStr){
char *ipTokens = strtok(ipStr, ".");
int xxxCount = 0;
while(ipTokens){
char *endptr;
long int xxxIp;
xxxIp = strtol(ipTokens, &endptr, 10);
if(endptr == ipStr){
return 0;
}
else if (*endptr != '\0'){
return 0;
}
else{
if(xxxIp >= 0 && xxxIp <= 255){
xxxCount += 1;
}
else{
return 0;
}
}
ipTokens = strtok(NULL,".");
}
if(xxxCount == 4){
return 1;
}
else{
return 0;
}
}
//Recieves a string in the form 'x.x.x.x-x.x.x.x', splits the 2 IP's by "-", and validates the IP
int splitOnDash(char* ipStr){
char *fullIp = strtok(ipStr, "-");
char fullIpCopy [] = "tempString";
while(fullIp){
strcpy(fullIpCopy, fullIp);
int validIp = splitOnDot(fullIpCopy);
if(validIp == 0){
return 0;
}
fullIp = strtok(NULL,"-");
}
return 1;
}
strtok
函数使用静态数据来跟踪迄今为止解析的内容。 如果您尝试使用它来执行像这样的多个“级别”分隔符,则一个级别的解析将干扰另一级别的解析。
为此,您需要使用
strtok_r
。 该函数需要一个附加参数来跟踪其状态。
所以
splitOnDash
将修改如下:
int splitOnDash(char* ipStr){
char *saveptr = NULL; // state for strtok_r
char *fullIp = strtok_r(ipStr, "-", &saveptr);
char fullIpCopy [] = "tempString";
while(fullIp){
strcpy(fullIpCopy, fullIp);
int validIp = splitOnDot(fullIpCopy);
if(validIp == 0){
return 0;
}
fullIp = strtok_r(NULL,"-", &saveptr);
}
return 1;
}
对于
splitOnDot
也类似。