用程序实现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. C/c++输入输出函数

    最全输入函数 c/c++一:c=getchar();功能:读入一个字符说明:调用此函数时要求在程序的第一行有预编译命令:#include<stdio>,不过在做c++时 有#include ...

  2. git branch

    使用git管理工具,branch 应该是我们接触最多的.不论我们是修复bug,还是做项目,都会新开branch,工作完成后再合并. 然而对一些初学者,对git的一些命令知之甚少,这里,给大家写一些常用 ...

  3. Hibernate与Jpa的关系,终于弄懂

    我知道Jpa是一种规范,而Hibernate是它的一种实现.除了Hibernate,还有EclipseLink(曾经的toplink),OpenJPA等可供选择,所以使用Jpa的一个好处是,可以更换实 ...

  4. Internet Explorer for Mac the Easy Way: Run IE 7, IE8, & IE9 Free in a Virtual Machine

        From link: http://osxdaily.com/2011/09/04/internet-explorer-for-mac-ie7-ie8-ie-9-free/ If you’re ...

  5. CSS效果

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs& ...

  6. UVa 11168 (凸包+点到直线距离) Airport

    题意: 平面上有n个点,求一条直线使得所有点都在直线的同一侧.并求这些点到直线的距离之和的最小值. 分析: 只要直线不穿过凸包,就满足第一个条件.要使距离和最小,那直线一定在凸包的边上.所以求出凸包以 ...

  7. sqlserver 导入/导出Excel

    --从Excel文件中,导入数据到SQL数据库中,很简单,直接用下面的语句: /*=========================================================== ...

  8. eclipse export Android jar with jni

    /*********************************************************************** * eclipse export Android ja ...

  9. Java [Leetcode 122]Best Time to Buy and Sell Stock II

    题目描述: Say you have an array for which the ith element is the price of a given stock on day i. Design ...

  10. 【C#学习笔记】播放wma/mp3文件

    using System; using System.Runtime.InteropServices; namespace ConsoleApplication { class Program { [ ...