simple_strtoul()
//此函数有以下几点值得注意:
//1、第一个参数中的const。一般在函数的形参中,如果我们只是希望调用者使用该参数,而不会去改变该参数
内容(一般是指针指向的内容),则可以声明为const。
呢?只能通过参数了。一般的参数是用来向函数输入信息的,但是指针型参数可以间接用来从函数输出信
息。使用时用户只需传入一个相应的指针,函数中会把需要输出的信息地址传给这个指针,这样在函数调用
完成后,用户即可到endp指针处去取函数传出的值了。这就是用参数实现返回值的方式。但是要注意,在函
数中千万不可把局部变量的地址传给输出型指针,因为局部变量存在栈里,函数调用结束后即释放了,传出
的指针指向的内容是栈上已经被释放的部分,因此是无效的。(PS:高级语言中譬如C#有ref,out关键字,
以明确指明该引用为输出型)
//3、第三个参数base。要注意这个base的机制,本函数中是按照这样的理念来设计的。即如果str中有0x开头且
接下来是数字则忽略用户调用时输入的base,强制为16进制。如果str不是上面情况然后才看用户输入的
base。用户输入非0则使用用户指定的base,若用户输入0则自动判断是8进制还是10进制。需要强调的是:
使用习惯决定理念,理念决定代码逻辑。
//4、注意
if(endp)这里,在输出型参数使用中,函数内首先判断endp是否为NULL,并以此来决定是否输出这个
机制来自于一个理念:这个输出参数有可能是用户关注的,也有可能是用户不在意的。这样处理可以给用户
自由,即用户如果在意就传一个有效指针过来接收;如果不在意调用时直接给个NULL就行。提供服务但不
函数说明
就是解析字符串cp 中 8,10,16 进制数字 ,返回值是解析的数字,endp 指向字符串起始处,base :进制
看看 内核中的函数:proc_scsi_write 就知道了。
unsigned long
simple_strtoul(const char *cp,char **endp,unsigned int
base)
{
unsigned
long result = 0,value;
//对于base,首先如果*cp以0x开头且下来是数字,则一定为16进制。然后如果用户指定了一个非0的进制,则
//遵循用户输入的进制。如果用户输入了0进制,则根据是否0开头来确定是8进制还是10进制
if (*cp ==
'0') {
cp++;
if ((*cp == 'x')
&& isxdigit(cp[1]))
{
base = 16;
//如果cp是0x开头的,下面一个又是数字,那么base一定为16。
cp++;
//此时即使用户输入了一个base,也忽略这个base而强制其为16。
}
if (!base) {
base = 8;
//如果用户输入base为0,cp是0开头,接下来不是x,那么强制为8进制
}
}
if (!base)
{
base = 10;
//如果用户输入base为0,cp是非0开头,则使用10进制。
}
//while循环里value<base是精髓所在。这个解析停止的条件不能是null,而应该是str中
(isxdigit(*cp) && (value =
isdigit(*cp) ? *cp-'0' : (islower(*cp)
? toupper(*cp) : *cp)-'A'+10) < base)
{
result = result*base + value;
cp++;
}
if (endp)
//此处if判断的作用是:用户在使用这个函数时,如果不关心endp则可以直接
*endp = (char *)cp;
//使用null,而不必担心程序运行会出错。这种处理技巧很实用,用户可以
return result;
//自行决定是否使用这个函数提供的参数式返回值。
}
simple_strtoul()的更多相关文章
- linux中字符串转换函数 simple_strtoul【转】
转自:http://blog.csdn.net/tommy_wxie/article/details/7480087 Linux内核中提供的一些字符串转换函数: lib/vsprintf.c [htm ...
- linux中字符串转换函数 simple_strtoul
Linux内核中提供的一些字符串转换函数: lib/vsprintf.c 1. unsigned long long simple_strtoull(const char *cp, char **en ...
- simple_strtoul()分析
此函数有以下几点值得注意:1.第一个参数中的const.一般在函数的形参中,如果我们只是希望调用者使用该参数,而不会去改变该参数内容(一般是指针指向的内容),则可以声明为const.2.第二个参数.C ...
- Android中基于CGroup的memory子系统HAL层分析-lmkd
Android在内存管理上于Linux有些小的区别,其中一个就是引入了lowmemorykiller.从lowmemorykiller.c位于drivers/staging/android也可知道,属 ...
- uboot 第三天学习
make jCPU_NUM 以CPU_NUM数量同时进行编译CPU_NUM = 当前PC的处理器数量*处理器的核心数 从上电开始1.系统上电,执行固化在IROM中的代码,目的初始化基本的系统功能,已经 ...
- u-boot移植 II
下面是韦老师的uboot移植攻略: A. 开发板的相关拷贝与修改 1. 在board文件夹下面, 将原来的smdk2410复制为100ask24x0目录, 并将smdk2410.c改名为100ask2 ...
- kernel/vsprintf.c
/* * linux/kernel/vsprintf.c * * Copyright (C) 1991, 1992 Linus Torvalds */ /* vsprintf.c -- Lars ...
- 给linux安全模块LSM添加可链式调用模块(一)
前些日子接了个外包的活,了解了一下Linux安全模块,发现了安全模块中的一些问题. 关于linux安全模块LSM在此就不多说了,大家google下就明白了. 这里主要介绍的是如何修改这个模块,使它可链 ...
- Linux内核--网络栈实现分析(三)--驱动程序层+链路层(上)
本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7497260 更多请看专栏,地址 ...
随机推荐
- 根据节点解析xml
config.xml文件如下: <?xml version="1.0" encoding="gb2312" ?> <root> < ...
- 安装lszrz,用于上传文件
wget http://down1.chinaunix.net/distfiles/lrzsz-0.12.20.tar.gztar zxvf lrzsz-0.12.20.tar.gzcd lrzsz- ...
- php之trait-实现多继承
PHP是单继承的语言,在PHP 5.4 Traits出现之前,PHP的类无法同时从两个基类继承属性或方法.php的Traits和Go语言的组合功能类似,通过在类中使用use关键字声明要组合的Trait ...
- 基于flask和百度AI接口实现前后端的语音交互
话不多说,直接怼代码,有不懂的,可以留言 简单的实现,前后端的语音交互. import os from uuid import uuid4 from aip import AipSpeech from ...
- 深入解析当下大热的前后端分离组件django-rest_framework系列三
三剑客之认证.权限与频率组件 认证组件 局部视图认证 在app01.service.auth.py: class Authentication(BaseAuthentication): def aut ...
- COCOS2D - JS 之JSON 解析
list 类型的json数据 var source = ["10004","1234","4","3","1 ...
- php 获取指定月份的开始结束时间
/** * * 获取指定年月的开始和结束时间戳 * * @param int $y 年份 * @param int $m 月份 * @return array(开始时间,结束时间) */ functi ...
- POJ 2777.Count Color-线段树(区间染色+区间查询颜色数量二进制状态压缩)-若干年之前的一道题目。。。
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 53312 Accepted: 16050 Des ...
- (2)go 规范,变量,基本数据类型
.一.规范 main 函数为入口 严格区分大小写 不需要加分号 一行只写一条语句 定义的变量或者导入的包必须要用到,否则编译时会报错 左括号不能单独一行 逗号可以用来在换行时连接字符串 标识符由字母数 ...
- js实现杨辉三角
杨辉三角是计算二项式乘方展开式的系数时必不可少的工具.是由数字排列而成的三角形数表. 资料:杨辉三角第n行的第1个数为1,第二个数为1×(n-1),第三个数为1×(n-1)×(n-2)/2,第四个数为 ...