我找不到此细分错误

问题描述 投票:3回答:2

所以我正在执行this codewars kata,并且在每个测试中都成功,但最终结果失败,因为我的代码存在分段错误,而且我认为我对该语言的了解不足以找到它!有人可以暂停吗?

int is_valid_ip(const char *addr) 
{
    char set[] = "1234567890";
    int current;
    int octet_counter = 0;
    char *octet = 0;
    octet = strtok(addr, ".");
    while (octet)
    {
        if (strspn(octet, set) != strlen(octet)) return 0; // checks for spaces
        if (strlen(octet) > 1 && (octet[0]) == '0') return 0; // checks for preceding zeros
        sscanf(octet, "%d", &current);
        if (current < 0 || current > 255) return 0; // checks for range
        octet = strtok(0, ".");
        ++octet_counter;
    }
    if (octet_counter == 4) return 1; // checks for number of octets
    return 0;
};

我的代码有点干净,但是在试图解决这个问题之后经过很多混乱之后,它变成了这个...

c c11
2个回答
4
投票

由于strtok()修改了要标记的字符串,并且addr被定义为const char *(我认为这是必要条件),您可以复制输入字符串*addr

char ip[16]; // enought to hold nnn.nnn.nnn.nnn
if(strlen(addr)>15) return 0;
strcpy(ip, addr);

随后在ip而不是addr上操作>


或者...避免使用strtok并解析/扫描字符串而不进行修改。


0
投票

这里是一个使用sscanf的愚蠢解决方案,只是为了表明它是可能的。 (下面有一些更好的解决方案。)

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