strtoul函数的使用,揭开其神秘面纱
之前使用strtoul函数时,从来没思考过它的用法,最近在编写驱动设计时,突遇这个函数,发现这函数还是有值得探讨的地方。
其函数原型如下:
unsigned long strtoul(const char *nptr,char **endptr,int base )
参数1:字符串起始地址
参数2:返回字符串有效数字的结束地址,这也是为什么要用二级指针的原因。
参数3:转换基数。当base=0,自动判断字符串的类型,并按10进制输出,例如"0xa",就会把字符串当做16进制处理,输出的为10。更多的下面详细阐述。
贴上函数原型
#define strtoul simple_strtoul
#define TOLOWER(x) ((x) | 0x20)static unsigned int simple_guess_base(const char *cp)
{if (cp[0] == '0') {if (TOLOWER(cp[1]) == 'x' && isxdigit(cp[2]))return 16;elsereturn 8;} else {return 10;}
}unsigned long simple_strtoul(const char *cp, char **endp, unsigned int base)
{unsigned long result = 0;if (!base)base = simple_guess_base(cp);if (base == 16 && cp[0] == '0' && TOLOWER(cp[1]) == 'x')cp += 2;while (isxdigit(*cp)) {unsigned int value;value = isdigit(*cp) ? *cp - '0' : TOLOWER(*cp) - 'a' + 10;if (value >= base)break;result = result * base + value;cp++;}if (endp)*endp = (char *)cp;return result;
}
函数分析:
1 simple_strtoul()函数里的第一个if语句,如果base=0,自动对字符串里的数字格式进行分析,并返回基数,其值可取8、16、10。第二个if语句,进一步对16进制数处理,是cp指向第三个字符。
2 while循环条件:判断是否为可处理的字符,其处理范围为‘0’-‘9’,‘a’-‘f,‘A'-'F'。
循环体内:如果*cp为数字则value=*cp-'0';如果*cp为字符value=*cp-’a‘+10。
判断value的值,如果value>=base,表明其值超过了基数,是一个不合法的数字,跳出循环。例如基数base=3, 数码符号为0,1,2,3。 此时value=4时就不是一个数码符号。
3 处理尾指针,使其指向字符串有效数字的结束地址。
4 返回result。
测试代码:
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{unsigned int num1,num2,num3 ,num4,num5,num6 ; char *stop_at =NULL ; char temp1[16] = "0xa" ; char temp2[16] = "011" ; char temp3[16] = "123" ; char temp4[16] = "0xa" ; char temp5[16] = "11" ; char temp6[16] = "Z" ; //if base==0num1=strtol(temp1,&stop_at,0); num2=strtol(temp2,&stop_at,0); num3=strtol(temp3,&stop_at,0); //if base>1 && base <=32num4=strtol(temp4,&stop_at,16); num5=strtol(temp5,&stop_at,2); num6=strtol(temp6,&stop_at,36); cout<<num1<<endl;cout<<num2<<endl;cout<<num3<<endl;cout<<num4<<endl;cout<<num5<<endl;cout<<num6<<endl;return 0;
}
测试结果:
10
9
123
10
3
35
注意:1 如果字符串以非数字开始,返回值0。
2 基数表示把字符串里的数字当做base进制处理,输出的结果把base进制转换成了10进制。
3 base=0时,会自动对字符串进行处理,例如以0x开始,其字符串看做是16进制数;以0开始,其字符串看做是8进制数。
4 如果base=n(1<n<=36),为什么可取到36,很简单,10个数字+26个字母=36。
5 如果base=1时呢? 经测试出现调试错误,也很简单,你听过1进制数吗?!。
6 尾指针指向字符串有效数字的结束地址。
strtoul函数的使用,揭开其神秘面纱相关推荐
- 冰河浅析 - 揭开***的神秘面纱
一.基础篇(揭开***的神秘面纱) 无论大家把***看得多神秘,也无论***能实现多么强大的功能,***,其实质只是一个网络客户/服务程序.那么,就让我们从网络客户/服务程序的编写开始. 1.基本概念 ...
- python可以干什么-Python可以用来做什么 为你揭开python神秘面纱
Python可以用来做什么 为你揭开python神秘面纱 时间:2018-01-24 来源:解读Python 最近,编程界又一语言可谓是着实又火了一把,什么语言呢?python,python为 ...
- python可以给你干什么-Python可以用来做什么 为你揭开python神秘面纱
Python可以用来做什么 为你揭开python神秘面纱 时间:2018-01-24 来源:解读Python 最近,编程界又一语言可谓是着实又火了一把,什么语言呢?python,python为 ...
- 微信支付官方揭开刷脸支付神秘面纱
无利不起早这句话经久不衰,想要提高用户的站粘性,就必须在服务或附加值上面花点心思.微信青蛙Pro就是二者之间的建设桥梁,它将给予消费者一种全新的支付体验.今年,刷脸支付大面积普及,各种消息不胫而走,好 ...
- 揭开netty神秘面纱_Netty 源码(ChannelHandler 死磕)
疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 面试必备 + 面试必备 疯狂创客圈 经典图书 : <SpringC ...
- 少林寺公布武功秘籍 揭开绝技神秘面纱(组图)
白岩松:您好观众朋友,欢迎收看<新闻会客厅>.可能很多人在读过武侠小说的时候都会发现几乎很多武侠小说都有这样的一个共同的情节,就是不同的门派为了争夺一本武林秘籍打得不可开交.但是在现实 ...
- 被妖化的金字塔上篇(揭开金字塔神秘面纱,还原古埃及金字塔真相)
古埃及金字塔被称为人类文明的伟大奇迹之一,长期以来一直充满了各种各样神秘的传说. 至今为止金字塔中存在的科学数据一直都是个迷.远古时间的科技文明真的那么发达了么? 金字塔中的数学不解之谜: 1.金字塔 ...
- 冰河浅析 - 揭开***的神秘面纱(下)
本文主要是探讨***的基本原理, ***的破解并非是本文的重点(也不是我的长处),具体的破解请大家期待yagami的<特洛伊***看过来>(我都期待一年了,大家和我一起继续期待吧,嘿嘿), ...
- 【启明云端】启明云端带你揭开WT32-S3-WROVER神秘面纱
一.描述 WT32-S3-WROVER 是通用型 Wi-Fi+低功耗蓝牙 MCU 模组,搭载 ESP32-S3 系列芯片.除具有丰富的外设接口外,模组还拥有强大的神经网络运算能力和信号处理能力,适用于 ...
最新文章
- ElasticSearch Groovy脚本远程代码执行漏洞
- 还搞不懂 Java NIO?快来读读这篇文章!
- Javascript JQuery获取当前元素的兄弟元素/上一个/下一个元素(转)
- 用于特征选择的F-Score打分及其Python实现
- js控制select数据绑定下拉列表
- c语言程序检测进程pid,C语言实现由PID获取进程名由进程名获取PID
- linux如何在a休息时运行b,Linux下如何优雅地修正命令?
- 消息队列(5):RocketMQ
- android旋转角度,android 旋转角度总结
- 数据结构(C++)—— 向量(Vector)
- BeanUtils组件使用小指南
- python中的类装饰器应用场景_python中的装饰器常用于哪些应用场景
- 二级c语言试题讲解,计算机二级C语言真题讲解.ppt
- php smarty 翻译标签,Smarty自定义block标签
- python 模拟触屏_python一次简单游戏辅助的经历(截取屏幕模拟键盘)
- android地球经纬度平面图,地球经纬度划分图高清 怎么划分经纬度
- 2022爱分析· 工业互联网厂商全景报告
- AnyTrans for Mac(ios数据传输工具)
- w5500跨网段_串口转以太网模块—W5500S2E-S1如何与计算机建立局域网
- Maximal GCD