//此函数有以下几点值得注意:

//1、第一个参数中的const。一般在函数的形参中,如果我们只是希望调用者使用该参数,而不会去改变该参数

//  
  内容(一般是指针指向的内容),则可以声明为const。

//2、第二个参数。C语言中函数只能有一个返回值,但是有时候我们希望从函数中得到不止一个返回内容怎么办
//    
呢?只能通过参数了。一般的参数是用来向函数输入信息的,但是指针型参数可以间接用来从函数输出信
//    
息。使用时用户只需传入一个相应的指针,函数中会把需要输出的信息地址传给这个指针,这样在函数调用
//    
完成后,用户即可到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就行。提供服务但不
//     强迫,这样很好。在OS的API中很多时候都有类似的技巧,请注意体会。
 

函数说明
就是解析字符串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中

    //第一个不是数字的字母。这个字母的范围取决于base,譬如如果是16进制那么f也算是数字。
    //而如果是8进制那么9都不算是数字了。因此解析结束的范围只能和base比较来限定。
    while
(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()的更多相关文章

  1. linux中字符串转换函数 simple_strtoul【转】

    转自:http://blog.csdn.net/tommy_wxie/article/details/7480087 Linux内核中提供的一些字符串转换函数: lib/vsprintf.c [htm ...

  2. linux中字符串转换函数 simple_strtoul

    Linux内核中提供的一些字符串转换函数: lib/vsprintf.c 1. unsigned long long simple_strtoull(const char *cp, char **en ...

  3. simple_strtoul()分析

    此函数有以下几点值得注意:1.第一个参数中的const.一般在函数的形参中,如果我们只是希望调用者使用该参数,而不会去改变该参数内容(一般是指针指向的内容),则可以声明为const.2.第二个参数.C ...

  4. Android中基于CGroup的memory子系统HAL层分析-lmkd

    Android在内存管理上于Linux有些小的区别,其中一个就是引入了lowmemorykiller.从lowmemorykiller.c位于drivers/staging/android也可知道,属 ...

  5. uboot 第三天学习

    make jCPU_NUM 以CPU_NUM数量同时进行编译CPU_NUM = 当前PC的处理器数量*处理器的核心数 从上电开始1.系统上电,执行固化在IROM中的代码,目的初始化基本的系统功能,已经 ...

  6. u-boot移植 II

    下面是韦老师的uboot移植攻略: A. 开发板的相关拷贝与修改 1. 在board文件夹下面, 将原来的smdk2410复制为100ask24x0目录, 并将smdk2410.c改名为100ask2 ...

  7. kernel/vsprintf.c

    /* *  linux/kernel/vsprintf.c * *  Copyright (C) 1991, 1992  Linus Torvalds */ /* vsprintf.c -- Lars ...

  8. 给linux安全模块LSM添加可链式调用模块(一)

    前些日子接了个外包的活,了解了一下Linux安全模块,发现了安全模块中的一些问题. 关于linux安全模块LSM在此就不多说了,大家google下就明白了. 这里主要介绍的是如何修改这个模块,使它可链 ...

  9. Linux内核--网络栈实现分析(三)--驱动程序层+链路层(上)

    本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7497260 更多请看专栏,地址 ...

随机推荐

  1. 安装icephp 记

    下面开始安装: 一:yum 安装 首先需要添加一个yum源. # vi /etc/yum.repos.d/zeroc-ice-amzn.repo写入: [zeroc-ice]name=Ice 5 fo ...

  2. 计数排序的实现--适用于元素均较小的seq

    今天无聊就打算把所有的排序算法都看一遍... 计数排序的时间复杂度是O(n),在算法导论中,用决策树模型中论证了,比较排序的情况为nlogn的复杂度.而计数排序的时间复杂度小于他的原因就是它不需要进行 ...

  3. 虚拟机 VMware Workstation12 安装Ubuntu系统

    Ubuntu 系统是一款优秀的.基于GNU/Linux 的平台的桌面系统. 当然,目前为止很多应用程序还完全不能允许运行在 Ubuntu 系统上,而且 Ubuntu 的界面.使用方法会让大部分Wind ...

  4. Mysql 中的Text字段的范围

    mysql中text 最大长度为65,535(2的16次方–1)字符的TEXT列.如果你觉得text长度不够,可以选择 MEDIUMTEXT最大长度为16,777,215. LONGTEXT最大长度为 ...

  5. .NET 二进制序列化器,SOAP序列化器,XML序列化器

    这里就不说JSON序列化了,只介绍三种:二进制序列化器,SOAP序列化器,XML序列化器 直接上代码: /// <summary> /// 二进制序列化器. /// 最节省流量,压缩程度最 ...

  6. 解决报错:Access denied for user 'root'@'xxx' ,MySQL不允许从远程访问的方法 .

    原文地址:传送门 例如,你想myuser使用mypassword从任何主机连接到mysql服务器的话. GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDEN ...

  7. Jquery 学习之路(五)grid绑定模板

    最近在使用mvcpager时发现ajax分页需要使用Partial来实现,而且使用起来还是觉得不太方便.突然想自己做一个mvc的ajax分页,但是如果table直接用js输出就不好维护了. angul ...

  8. shell日志重定向到null

    用输出重定向符号> 即可,格式如下:shell命令 >/dev/null 若要将标准错误输出也一并重定向,如下:shell命令 >/dev/null 2>&1这样就不管 ...

  9. pytho中pickle、json模块

    pickle & json 模块 json,用于字符串 和 python数据类型间进行转换 pickle,用于python特有的类型 和 python的数据类型间进行转换 json模块提供了四 ...

  10. vmware漏洞之一——转:利用一个堆溢出漏洞实现VMware虚拟机逃逸

    转:https://zhuanlan.zhihu.com/p/27733895?utm_source=tuicool&utm_medium=referral 小结: vmware通过Backd ...