所以我正在执行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", ¤t);
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;
};
我的代码有点干净,但是在试图解决这个问题之后经过很多混乱之后,它变成了这个...
由于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
并解析/扫描字符串而不进行修改。
这里是一个使用sscanf
的愚蠢解决方案,只是为了表明它是可能的。 (下面有一些更好的解决方案。)