用程序实现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. 对于大数据量的Json解析

    近几天做了一个项目,需要解析大量的json数据,有一万多条,以前我用的都是Gson包去自动解析,但是速度真是不敢恭维,于是我又去查了其它的方法,发现fastjson的解析,发现速度直的是很快,在此我不 ...

  2. 解决ssh-connect-to-host-github-com-port-22-connection-timed-out

    PC:~$ ssh git@github.com ssh: connect to host github.com port 22: Connection timed out 解决办法:(linux下) ...

  3. mysql 5.5 升级到 mysql 5.6

    目前MySQL数据库软件升级到5..26版本,主要有两种方法.一种是停机升级,即在现有环境下先停止数据库,然后升级数据库软件版本和数据库版本:另外一种是采用不停机的主从升级(master--slave ...

  4. 有关SetTimer函数的用法

    1 )用WM_TIMER来设置定时器 先请看SetTimer这个API函数的原型 UINT_PTR SetTimer( HWND hWnd, // 窗口句柄 UINT_PTR nIDEvent, // ...

  5. iostat中 %util高 应用延迟高

    经过长时间监控,发现iostat 中的%util居高不下,一直在98%上下,说明带宽占用率极高,遇到了瓶颈. 且读写速度很慢,经过排查,发现是HBA卡出现问题,更换后,用dd if命令测试,磁盘的读写 ...

  6. day08 Html

    <del>我被删除了</del> <!--delete--> <b>我是粗体</b> <!-- bold --> <i&g ...

  7. 814-Binary Tree Pruning

    Description: We are given the head node root of a binary tree, where additionally every node’s value ...

  8. python多线程用法及与单线程耗时比较

    下面,通过一个简单的例子,来把多线程和单线程执行任务的耗时做个比较 import time import threading # 音乐播放器 def music(func, loop): for i ...

  9. 提示 make: 没有什么可以做的为 `all&#39;

    提示 make: 没有什么可以做的为 `all'. make clean 一次,编译过程又有了.

  10. hdfs遍历文件方法

    import org.apache.commons.lang.StringUtils; import org.apache.hadoop.conf.Configuration; import org. ...