C - strtok 跳过第二个标记

问题描述 投票:0回答:1

我正在用 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; 
}
c strtok
1个回答
0
投票

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
也类似。

© www.soinside.com 2019 - 2024. All rights reserved.