用程序实现ipv4地址字符串是否合法,主要考察的是C字符串的操作。

搜索了下,网上没有特别好的实现,自己实现了下,见笑于大家,请指正。

#include <stdio.h>
#include <string.h>
int valid_ip_segment(const char* begin,
const char* end) {
int len = end - begin;
if (len < || len > ) {
return -; // unvalid_length
}
int sum = ;
while (begin < end) {
if (!isdigit(*begin)) {
return -; // unvlaid_char
}
sum *= ;
sum += *begin - '';
++begin;
}
if (sum > ) {
return -;// unvalid_sum
}
return ;
} int valid_ip_address(const char* ip_str) {
if (!ip_str) {
return -;
}
const char* begin = ip_str;
const char* end = NULL;
int seg_count = ;
int ret = ;
while ((end = strchr(begin, '.'))) {
if ((ret = valid_ip_segment(begin, end)) < ) {
return ret;
}
++seg_count;
begin = end + ;
}
if (seg_count != ) {
return -;
}
end = begin;
while(*end) {
++end;
}
return valid_ip_segment(begin, end);
} struct TestCase {
const char* ip_address;
int expect_ret;
}; int main() {
const struct TestCase test_case[] = {
{"102.1.1.x1", -},
{"102.1.11.11", },
{"102.1.881.1", -},
{"102.1.8.-1", -},
{"102.1.8..1", -},
{"102.1.1.-x3xx", -}
};
size_t len = sizeof(test_case)/sizeof(test_case[]);
int i = ;
int ret = ;
for (;i < len; ++i ) {
if ((ret = valid_ip_address(test_case[i].ip_address))
!= test_case[i].expect_ret) {
printf("expect %d\t but return %d\n", test_case[i].expect_ret , ret);
} else {
printf("%s\t is with ret %d\n", test_case[i].ip_address, ret);
}
}
return ;
}

用C语言实现ipv4地址字符串是否合法的更多相关文章

  1. iOS开发系列--C语言之数组和字符串

    概览 数组在C语言中有着特殊的地位,它有很多特性,例如它的存储是连续的,数组的名称就是数组的地址等.而在C语言中是没有String类型的,那么如果要表示一个字符串,就必须使用字符数组.今天主要就介绍如 ...

  2. IP地址字符串与BigInteger的转换

    /**  * Copyright (c) 2010, 新浪网支付中心  *      All rights reserved.  *  * Java IP地址字符串与BigInteger的转换,  * ...

  3. c语言字符数组与字符串的使用详解

    转自:http://www.jb51.net/article/37456.htm 1.字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素.char str[10]={ ...

  4. python网络编程——将IPv4地址转换成不同的格式

    1.将IPv4地址转换为32位二进制格式,用做底层网络函数. import socket from binascii import hexlify def convert_IPv4_address() ...

  5. Java IP地址字符串与BigInteger的转换, 支持IPv6

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  6. IPv4地址(二)网络划分

    在IPv4地址(一)中提到过,IP地址可以分成两部分,前面一部分是网络号,而后面一部分是主机号. 这里网络可以通过主机数量规模不同而分为3类:大型网络.中型网络和小型网络. 不同网络的特点 大型网络— ...

  7. C语言中函数返回字符串的4中方法

    C语言中函数返回字符串的4中方法 函数的构成部分:返回类型.函数名称.参数.函数主体 参数:函数调用时传入的参数称为实参,函数定义时出现的参数为形参 形参的作用在于接收实参传入的值,形参和函数内部的其 ...

  8. IPv4地址段、地址掩码、可用地址等常用方法

    package com.xxx.iptools; import java.util.ArrayList; import java.util.HashMap; import java.util.List ...

  9. 网络连接详细信息出现两个自动配置ipv4地址

    问题:网络连接详细信息出现两个自动配置ipv4地址,一个是有效地址,一个是无效地址. 解决办法:先将本地连接ip设置成自动获取,然后点击开始——>运行——>输入cmd,回车,进入命令行界面 ...

随机推荐

  1. javadoc 和 javadoc注释规范

    javadoc是Sun公司提供的一个技术,它从程序源代码中抽取类.方法.成员等注释形成一个和源代码配套的API帮助文档. javadoc命令是用来生成自己API文档的,使用方式:在dos中在目标文件所 ...

  2. bzoj2395

    分组赛时学到的最小乘积生成树模型,感觉这个思路非常神,可以说是数形结合的经典问题 由于生成树有两个权值,我们把每个生成树的权值表示成点坐标(sa,sb) 显然我们知道,乘积最小,那么点必然落在下凸壳上 ...

  3. [swustoj 373] Antiprime数

    Antiprime数(0373) 问题描述 如果一个自然数n(n>=1),满足所有小于n的自然数(>=1)的约数个数都小于n的约数个数,则n是一个Antiprime数.譬如:1, 2, 4 ...

  4. codevs 1197 Vigenère密码

    开始做NOIP啦.. #include<iostream> #include<cstdio> #include<cstring> #include<algor ...

  5. C# winform 窗体从右下角向上弹出窗口效果

    参考自 http://blog.csdn.net/yilan8002/article/details/7197981 /// <summary> /// 窗体动画函数 注意:要引用Syst ...

  6. Mysqlbackup 备份详解(mysql官方备份工具)

    A.1全库备份. 命令: mysqlbackup --defaults-file=/home/mysql-server/mysql3/my.cnf  --user=root --password=ro ...

  7. PHP最佳实践(译)

    原文: PHP Best Practices-A short, practical guide for common and confusing PHP tasks 译者:youngsterxyf 最 ...

  8. db2数据库Date相关函数

    1.db2可以通过SYSIBM.SYSDUMMY1.SYSIBM.DUAL获取寄存器中的值,也可以通过VALUES关键字获取寄存器中的值. SELECT 'HELLO DB2' FROM SYSIBM ...

  9. solr4.5配置中文分词器mmseg4j

    solr4.x虽然提供了分词器,但不太适合对中文的分词,给大家推荐一个中文分词器mmseg4j mmseg4j的下载地址:https://code.google.com/p/mmseg4j/ 通过以下 ...

  10. MySQL5.6 replication architecture --原图来自姜承尧