用程序实现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. jquery.post用法

    使用ajax在前端验证是否执行某个操作 jquery.post参数为 url,[data],[callback],[type] url:发送请求地址. data:待发送 Key/value 参数. c ...

  2. 25-语言入门-25-n-1位数

    题目地址: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=96    描述已知w是一个大于10但不大于1000000的无符号整数,若w是n(n ...

  3. ListView(1)几个重要属性,关闭滚动到顶部,底部的动画,item之间的分割线,背景等

    见表: android:stackFromBottom="true" 设置该属性之后你做好的列表就会显示你列表的最下面,值为true和false android:transcrip ...

  4. 从unity3d官网下载教程

    http://unity3d.com/learn/tutorials/projects/tanks-tutorial 官网的教程提供的下载链接https://www.assetstore.unity3 ...

  5. Android动画效果translate、scale、alpha、rotate

    overridePendingTransition只支持android 2.0以上版本,动画效果在anim目录下的xml文件中定义,在程序中用AnimationUtils.loadAnimation( ...

  6. bzoj4042

    比较好的树形dp,涉及到树上路径的题目,我们往往考虑对路径分类 当我们考虑以x为根的子树,有这样几类路径 1. 起点终点都在子树内 2. 一个点延伸到子树外 对于要选择另一个点在子树外的路径,要建立在 ...

  7. oracle 11g rac 无法自动启动

    如果以上的操作依然不能使数据库资源自动启动,那么参考下面这篇文章修改资源AUTO_START属性. 查看资源状态: crsctl status resource 资源       -p     crs ...

  8. None

    0 值的整型 / 浮点型.空字符串('').空列表([]). 空元组((,)).空字典({}).空集合(set())都等价于 False,但是不等于 None thing = None if thin ...

  9. SpringMVC——实现拦截器

    1. SpringMVC拦截器的概念与Struts2相同 2. 实现拦截器 (1) 项目结构 (2) 实现HandlerInterceptor接口 package com.zhengbin.contr ...

  10. Xcode中使用svn时,报证书验证错误Error validating server certificate for

    转:http://blog.csdn.net/yhawaii/article/details/7511141 今天使用Xcode自带的svn客户端时,总是连接不上服务器,报如下错误: Error va ...