#define IPADDR_SIZE 4
typedef struct ___tag_ipaddr_t { /* IP アドレス */
 unsigned char addr[IPADDR_SIZE];
 unsigned char mask;
} ipaddr_t;
typedef enum ___tag_BOOL { /* 論理型 */
 FALSE, TRUE
} BOOL;
/* buf は破壊されます */
BOOL str_to_ipaddr(char *buf, ipaddr_t *ip) {
 const char mask_sep[] = "/"; /* マスクとアドレスのセパレータ */
 const char ip_sep[] = "."; /* IP アドレスの桁のセパレータ */
 char *ipstr;
 const char *maskstr;
 const char *token;
 int i;
 /* xxx.xxx.xxx.xxx/yyy の分離 */
 if(ipstr = strtok(buf, mask_sep), ipstr == NULL)
  return false;
 if(maskstr = strtok(NULL, ""), maskstr == NULL)
  return false;
 ip->mask = atoi(maskstr);
 /* aaa.bbb.ccc.ddd の分離 */
 for(i = 0, token = strtok(ipstr, ip_sep);
   i < IPADDR_SIZE;
   ++i, token = strtok(NULL, ip_sep)) {
  if(token == NULL)
   return FALSE;
  ip->addr[i] = atoi(token);
 }
 return TRUE;
}