ipv4的ip字符串转化为int型
要求:
将现有一个ipv4的ip字符串(仅包含数字,点,空格), 其中数字和点之间的空格(至多一个)是合法的,比如“12 .3. 4 .62”,其他情况均为非法地址。写一个函数将ipv4地址字符串转化成int整数(只能遍历一遍字符串)。
实现思路:
1. 安全检查,null指针
2. 排除最容易的情况:长度、首/尾是否合法
3. 遍历(第2~第len-1个元素):
数字只考虑数值计算以及是否超出范围
" "前后只能为数字和"."
"."前后分别可以为数字或" ";"."不能超过3个;更新数组索引
#include<stdio.h>
#include<string.h> int is_digit(char ch)
{
return (ch>='0' && ch<='9')? 1:;
} int ipv4_to_int(char* str, int* part)
{
int len=,index=,i=;
char* ps=str; if(ps == NULL || part ==NULL)
return -; len=strlen(ps);
if(len< || len >)
return -; if(!is_digit(ps[]) || !is_digit(ps[len-]) )
return -; part[index]=part[index]*+(int)(ps[]-''); for(i=;i<len-;i++){
char ch = ps[i];
if(is_digit(ch)){
part[index]=part[index]*+(int)(ch-'');
if(part[index]>)
return -;
}
else if(ch==' ')
{
if( (is_digit(ps[i-]) && ps[i+]=='.') || \
(ps[i-]=='.' && is_digit(ps[i+])) )
continue;
else
return -;
}
else if(ch=='.')
{
if( (is_digit(ps[i-]) || ps[i-]==' ') && \
(ps[i+]==' ' || is_digit(ps[i+])) )
{
index++;
if(index>)
return -;
}
else
return -;
}
else
return -;
} part[index]=part[index]*+(int)(ps[i]-'');
if(part[index]>)
return -; return ;
} int main(int argc, char *argv[])
{
char exm[][]={
"255.255.255.255",
"0.0.0.0",
"12 .3. 4 .56",
{},
"2.3..",
"121 . 234 . 114 . 115.",
".12.4.7.7",
"123.34.55.",
"1.3.5.4.2.4",
" 123.3.4.5",
"123.45.67.67 ",
"12 3. 45.67. 67",
"12.256.0.1",
"A1.34.45.6",
"34.56.-2.5",
". . .",
}; int part[]={,,,};
int j=;
for(j=;j<;j++){
if(!ipv4_to_int(exm[j], part))
printf("ip_addr: %30s is <OK> ====> %d.%d.%d.%d\n",exm[j], part[],part[],part[],part[]);
else
printf("ip_addr: %30s is Invalid !!!\n",exm[j]); part[]=part[]=part[]=part[]=;
}
return ;
}
欢迎大家批评指正!! :-)
ipv4的ip字符串转化为int型的更多相关文章
- C++ 字符串分割,并把子字符串转换成int型整数
主要涉及到string类的两个函数find和substr: find()函数的用法: 原型:size_t find ( const string& str, size_t pos = 0 ) ...
- C语言:将16进制字符串转化为int类型值
将16进制字符串值转换为 int 整型值 此例中用 "1de" 作为测试字符串,实现代码如下: #include <stdio.h> #include <stdl ...
- 数组转集合、集合转数组、字符串数组与int型、long型数组等的转换
在项目中经常会遇到数组转集合.集合转数组.数组之间类型转换等操作 1.数组转集合 为了实现把一个数组转换成一个ArrayList,很多Java程序员会使用如下的代码: String str[] = { ...
- C语言atoi函数(将字符串转化为int)
头文件:#include <stdlib.h> atoi() 函数用来将字符串转换成整数(int),其原型为:int atoi (const char * str); [函数说明]atoi ...
- 字符串转化为int数组
String a = "1,2,3,4,5,6" String str[] = a.split(","); int array[] = new int[str. ...
- sql把varchar转化为int型
select Max(convert(int,id))from member_Info;
- c# sql在where查询语句中使用字符串变量与int型变量
使用where语句访问数据库时where语句用上文中以及定义过的变量来查询. string sql3 = string.Format("update Ships set ContainerN ...
- loadrunner 脚本开发-int型变量和字符串的相互转换
脚本开发-int型变量和字符串的相互转换 by:授客 QQ:1033553122 字符串转化为int型变量 Action2() { int j = 0; j = atoi("12345&qu ...
- 关于如何将_variant_t型转化为int型和string类型
1)将_variant_t型转化为int型 关于将_variant_t型转化为int型,网上有好多好多参考,但好多都很复杂并且还不对,其实整个转化过程就只一行代码可以搞定: _variant_t a; ...
随机推荐
- AHB总线协议(二)
下图是8拍回环字突发传输:地址将在 32 字节边界处回环因此地址 0x3C 之后的地址是 0x20. 下图是8增量半字突发传输,所以地址每次增加 2 个字节并且突发在递增因此地址连续增加通过了 16 ...
- 【转载】Gradle学习 第一章:引言
转载地址:http://ask.android-studio.org/?/article/7 We would like to introduce Gradle to you, a build sys ...
- Android源码分析(十一)-----Android源码中如何引用aar文件
一:aar文件如何引用 系统Settings中引用bidehelper-1.1.12.aar 文件为例 源码地址:packages/apps/Settings/Android.mk LOCAL_PAT ...
- CRM产品主数据在行业解决方案industry solution中的应用
AG3, choose this role: Create a new Acquisition Contracts: Here our product advances search will be ...
- SAP里SE38设置模板
经验丰富些的大佬们都会有一套自己的风格,比如report主程序里几个form,常见的fieldcat的宏定义,常见的一些数据定义等等. 1.使用事物代码SE38进入编辑器. 2.点击客户端最右下角的文 ...
- 集合(set)
'''set是一个无序(不支持索引和切片)而且不重复的集合,有些类似于数学中的集合,也可以求交集,求并集等,''' s1={1,2,3,1} #定义一个set s1 如果s1={}为空则默认定义一个字 ...
- (原)pytorch中使用TensorRT
转载请注明出处: https://www.cnblogs.com/darkknightzh/p/11332155.html 代码网址: https://github.com/darkknightzh/ ...
- 《linux就该这么学》课堂笔记15 vsftpd文件传输、Samba/NFS文件共享
1.为了能够在如此复杂多样的设备之间(Windows.Linux.UNIX.Mac等不同的操作系统)解决问题解决文件传输问题,文件传输协议(FTP)应运而生. FTP服务器是按照FTP协议在互联网上提 ...
- OpenSSL 下载和私钥证书、CERTIFICATE证书生成
openssl 是生成私钥和公钥证书的重要工具. Windows如何安装OpenSSL: 官网:https://www.openssl.org/community/mailinglists.html ...
- python关于type()与生成器generator的用法
如果按这种形式写 type(a)(b) 那此处的b是个可迭代对象,这个对象迭代完成后,再放到type里 from pymysql._compat import range_type, text ...