IP地址字符串转无符号整型uint
来源:互联网 发布:淘宝开店无忧是真的吗 编辑:程序博客网 时间:2024/05/22 13:44
考虑到转换的过程是处理数字和点,可以使用自动机的思想;
自动机的思想就是整一个状态-转移表,根据输入自动判断,
说白了就是正则表达式,在同一个状态下,不同的输入会转到不同的状态上去。
对于ip,就只有两个状态,要么是正在输入数字,要么是正在输入点,至于点和数字的个数以及数字大小等情况可以另外优化。
如果当前状态是正在输入数字,那么接下来的输入应该是数字,如果是数字则转入正在输入点的状态,否则返回错误。
如果当前的状态是正在输入点,则接下来的输入应该是点,如果是点则转入正在输入数字状态;如果是数字,
则说明数字还未接受结束,继续接受,然后维持该状态;如果是结束符则结算,否则返回错误。
#include <iostream>#include <string>using namespace std;#define IPLEN 16 // 设输入ip地址长度不超过16enum STATECODE // 状态{ERROR = -1,SUCCESS,READING_DOT,READING_NUM};/* ip to unint * 一般返回一个int作为errorCode,真正的返回值放在参数里 * para: ip,ip字符串; result,计算结果 * return: ERROR & SUCCESS */int ipToUnint(char * ip, unsigned int & result){if(NULL == ip){return ERROR;}unsigned int digit = 0; // ip地址的每个整数int dotNum = 0; // num of dotint digitNum = 0; // num of digitchar input = 0; // 当前输入字符int state = READING_NUM; // statefor(int i = 0; ; ++i){input = ip[i];if(state == READING_NUM) // 状态 reading num{if(input >= '0' && input <= '9'){state = READING_DOT;digit = input - '0';}else{return ERROR;}}else // 状态 reading dot{if(input >= '0' && input <= '9'){digit = digit * 10 + (input-'0');if(digit > 255 || digit < 0){return ERROR;}}else if(input == '.'){if(dotNum == 3){return ERROR;}++dotNum;result = (result<<8) + digit;digit = 0;state = READING_NUM;}else if(input == '\0'){if(dotNum != 3){return ERROR;}result = (result<<8) + digit;return SUCCESS;}else{return ERROR;}}}}void main(){char ipStr[IPLEN] = {0};string input = "";cin>>input;sscanf(input.c_str(), "%15s", ipStr);unsigned int result = 0;if(ipToUnint(ipStr, result) != ERROR){printf("result: %d\n", result);}else{printf("ERROR!\n");}}
0 0
- IP地址字符串转无符号整型uint
- C编程:字符串型IP地址转换为无符号整型
- C语言IP地址与无符号整形互转
- IP地址与无符号整形互转
- 【每日N题】“.”分IP地址转uint
- 无符号整型与有符号整型
- 使用MySQL内置函数将IP地址字符串转为无符号整数进行存取
- 整型与无符号整型相加
- 无符号整型赋值陷阱
- 无符号长整型llu
- 无符号整型赋值陷阱
- 无符号整型赋值陷阱
- Oracle IP地址整型与字符串型相互转换
- IP地址与无符号整数的互换
- 用无符号的整形来表示一个IP地址
- 将ip地址压缩到一个无符号整形中
- IP地址与无符号整数值相互转换
- 用无符号的整形来表示一个IP地址
- Bootstrap学习:徽章
- iPhone启动图片Launch Image能玩出的花儿
- mysql索引删除,修改,添加
- leetcode 240: Search a 2D Matirx II
- datatable取每行的每列的值,就这办法了,头疼
- IP地址字符串转无符号整型uint
- Easyui Treegrid 上下移动实现
- 文章标题
- Bootstrap学习:超大屏幕
- 10g Manual Database Creation in Oracle (Single Instance and RAC) (文档 ID 240052.1)
- UI设计——动画设计
- Python学习----高级特性
- iOS 的一种设计模式 类别 catagory
- 1358(Period)字符串匹配-KMP