strtoul_strtoull - CSDN
  • strtoul函数的使用

    2014-05-08 09:40:17
    之前使用strtoul函数时,从来没思考过它的用法,最近在编写驱动设计时,突遇这个函数,发现这函数还是有值得探讨的地方。 其函数原型如下: unsigned long strtoul(const char *nptr,char **endptr,int base ) ...

    之前使用strtoul函数时,从来没思考过它的用法,最近在编写驱动设计时,突遇这个函数,发现这函数还是有值得探讨的地方。
    其函数原型如下:
    unsigned long strtoul(const char *nptr,char **endptr,int base )
    参数1:字符串起始地址
    参数2:返回字符串有效数字的结束地址,这也是为什么要用二级指针的原因。
    参数3:转换基数。当base=0,自动判断字符串的类型,并按10进制输出,例如"0xa",就会把字符串当做16进制处理,输出的为10。更多的下面详细阐述。
    贴上函数原型

    1. #define strtoul                     simple_strtoul  
    2. #define TOLOWER(x) ((x) | 0x20)  
    3.   
    4. static unsigned int simple_guess_base(const char *cp)  
    5. {  
    6.     if (cp[0] == '0') {  
    7.         if (TOLOWER(cp[1]) == 'x' && isxdigit(cp[2]))  
    8.             return 16;  
    9.         else  
    10.             return 8;  
    11.     } else {  
    12.         return 10;  
    13.     }  
    14. }  
    15.   
    16. unsigned long simple_strtoul(const char *cp, char **endp, unsigned int base)  
    17. {  
    18.     unsigned long result = 0;  
    19.   
    20.     if (!base)  
    21.         base = simple_guess_base(cp);  
    22.   
    23.     if (base == 16 && cp[0] == '0' && TOLOWER(cp[1]) == 'x')  
    24.         cp += 2;  
    25.   
    26.     while (isxdigit(*cp)) {  
    27.         unsigned int value;  
    28.   
    29.         value = isdigit(*cp) ? *cp - '0' : TOLOWER(*cp) - 'a' + 10;  
    30.         if (value >= base)  
    31.             break;  
    32.         result = result * base + value;  
    33.         cp++;  
    34.     }  
    35.   
    36.     if (endp)  
    37.         *endp = (char *)cp;  
    38.     return result;  
    39. }  

    函数分析:
    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。

    测试代码:

    1. #include "stdafx.h"  
    2. #include   <iostream>   
    3. #include <stdlib.h>  
    4. using namespace std;  
    5. int _tmain(int argc, _TCHAR* argv[])  
    6. {  
    7.     unsigned   int   num1,num2,num3 ,num4,num5,num6   ;   
    8.     char   *stop_at  =NULL ;   
    9.     char   temp1[16]   =   "0xa"   ;   
    10.     char   temp2[16]   =   "011"   ;   
    11.     char   temp3[16]   =   "123"   ;   
    12.     char   temp4[16]   =   "0xa"   ;   
    13.     char   temp5[16]   =   "11"   ;   
    14.     char   temp6[16]   =   "Z"   ;   
    15.     //if base==0  
    16.     num1=strtol(temp1,&stop_at,0);   
    17.     num2=strtol(temp2,&stop_at,0);   
    18.     num3=strtol(temp3,&stop_at,0);   
    19.     //if base>1 && base <=32  
    20.     num4=strtol(temp4,&stop_at,16);   
    21.     num5=strtol(temp5,&stop_at,2);   
    22.     num6=strtol(temp6,&stop_at,36);   
    23.   
    24.     cout<<num1<<endl;  
    25.         cout<<num2<<endl;  
    26.     cout<<num3<<endl;  
    27.     cout<<num4<<endl;  
    28.     cout<<num5<<endl;  
    29.     cout<<num6<<endl;  
    30.     return 0;  
    31. }  
    测试结果:
    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函数简介

    2014-10-01 00:02:22
    函数原型:unsigned long strtoul( const char *nptr, char endptr, int base ) 参数一 字符串的起始地址。 参数二 返回字符串有效数字的结尾地址。如 123456ff789 则返回数字6的地址。 参数三 转化基数。例...
    函数功能为:把输入的字符串转换成数字。
    函数原型:
    unsigned long int strtoul (const char* str, char** endptr, int base);


    trC-string containing the representation of an integral number. endptrReference to an object of type char*, whose value is set by the function to the next character in str after the numerical value.
    This parameter can also be a null pointer, in which case it is not used. baseNumerical base (radix) that determines the valid characters and their interpretation.
    If this is 0, the base used is determined by the format in the sequence (see strtol for details).


    参数一 字符串的起始地址


    参数二 返回字符串有效数字的结尾地址。如 123456fe789 则返回数字f的地址。


    参数三 转化基数。
    例:将十进制转化为二进制
    
    

    #include <iostream>
    #include <stdlib.h>
    
    using namespace std;
    int main(int argc ,char* argv[])
    {
    	char* erjinzhi="1111";
    	char* p;int shijinzhi=strtoul(erjinzhi,&p,2);
    	cout<<shijinzhi;return 0;
    }


    
    
    展开全文
  • C语言strtoul函数简介

    2017-11-06 16:46:15
    C语言strtoul函数简介 一、函数原型:  unsigned long int strtoul(const char *nptr, char **endptr, int base);  unsigned long long int strtoull(const char *nptr, char **endptr,int base);  

    C语言strtoul函数简介

    一、函数原型:
              unsigned long int strtoul(const char *nptr, char **endptr, int base);
              unsigned long long int strtoull(const char *nptr, char **endptr,int base);
            1、参数nptr:字符串的起始地址

            2、参数endptr: 返回字符串有效数字的结尾地址。如 123456fe789 则返回数字f的地址。

            3、参数base:转化基数。   

                参数 base 范围从2 至36,或0。参数 base 代表 nptr 采用的进制方式,如 base 值为10 则采用             10 进制,若 base 值为16 则采用16 进制数等。


    二、功能描述:
              convert a string to an unsigned long integer(把输入的字符串转换成数字).

              strtoul() 会扫描参数nptr 字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过 isspace() 函数来检测),直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时('\0')结束转换,并将结果返回。


    三、所需头文件:
              #include <stdlib.h>

    四、特别需要注意下面两点:

        1、当 base 的值为 0 时,默认采用 10 进制转换,但如果遇到 '0x' / '0X' 前置字符则会使用 16 进制转换,遇到 '0' 前置字符则会使用 8 进制转换。

        2、若 endptr 不为NULL,则会将遇到的不符合条件而终止的字符指针由 endptr 传回;若 endptr 为 NULL,则表示该参数无效,或不使用该参数。本文最后的范例没有展示 endptr 参数的使用,你可以参考 strtol() 函数的范例来更加直观地了解 endptr 参数。


    五、实例一:输入字符串,base 的值为2,二进制转换。
    测试代码:
    #include <stdio.h> 
    #include <stdlib.h> 
    int main () 
    {   
    	char buffer [256];   
    	unsigned long ul; 
        char * endptr;
        while(1)
    	{
    	   printf ("Enter an unsigned number: ");  
    	   fgets (buffer, 256, stdin);   
    	   ul = strtoul (buffer, &endptr, 2);   
           printf ("Value entered: %lu ,the address of the first invalid character is %d ,invalid character=%s\n", ul,endptr,endptr);   
    	   system("pause"); 
    	}
    	return 0; 
    } 
    


    测试结果:


    六、实例二:输入字符串,base 的值为10,十进制转换。
    测试代码:
    #include <stdio.h> 
    #include <stdlib.h> 
    int main () 
    {   
    	char buffer [256];   
    	unsigned long ul; 
        char * endptr;
        while(1)
    	{
    	   printf ("Enter an unsigned number: ");  
    	   fgets (buffer, 256, stdin);   
    	   ul = strtoul (buffer, &endptr, 10);   
           printf ("Value entered: %lu ,the address of the first invalid character is %d ,invalid character=%s\n", ul,endptr,endptr);   
    	   system("pause"); 
    	}
    	return 0; 
    } 

    测试结果:


    六、实例三:输入字符串,base 的值为0的特殊情况。

         1、当 base 的值为 0 时,默认采用 10 进制转换,但如果遇到 '0x' / '0X' 前置字符则会使用 16 进制转换,遇到 '0' 前置字符则会使用 8 进制转换。

         2、若 endptr 不为NULL,则会将遇到的不符合条件而终止的字符指针由 endptr 传回;若 endptr 为 NULL,则表示该参数无效,或不使用该参数。本文最后的范例没有展示 endptr 参数的使用,你可以参考 strtol() 函数的范例来更加直观地了解 endptr 参数。


    测试代码:
    #include <stdio.h> 
    #include <stdlib.h> 
    int main () 
    {   
    	char buffer [256];   
    	unsigned long ul; 
        char * endptr;
        while(1)
    	{
    	   printf ("Enter an unsigned number: ");  
    	   fgets (buffer, 256, stdin);   
    	   ul = strtoul (buffer, &endptr, 0);   
           printf ("Value entered: %lu ,the address of the first invalid character is %d ,invalid character=%s\n", ul,endptr,endptr);   
    	   system("pause"); 
    	}
    	return 0; 
    } 
    


    测试结果:


    展开全文
  • B 二进制 Binary 的缩写 O 八进制 Octal 的缩写 D 十进制 Decimal的缩写 H 十六进制 Hexadecimal的缩写 strtoul 函数声明如下: ... // unsigned long strtoul (const char* str, cha
    B 二进制   Binary 的缩写
    O 八进制   Octal 的缩写
    D 十进制    Decimal的缩写

    H 十六进制 Hexadecimal的缩写


    strtoul

    函数声明如下:

    
    

        //====================

       // unsigned long strtoul (const char* str, char** endptr, int base);

        //第一个参数是要转换的字符数组(即字符串,要转换成字符数组样式);

        

        //第二个参数是第一个不能转换的字符的指针;表示字符串有效数字的结束地址,传0或者NULL表示不接收;若 endptr 不为NULL,则会将遇到的不符合条件而终止的字符指针由 endptr 传回;若 endptr NULL,则表示该参数无效,或不使用该参数。

        

        //第三个参数是办第一个参数当成多少进制的来处理后转成10进制的长整形; 范围从2 36,或0。参数 base 代表 str 采用的进制方式,如 base 值为10 则采用10 进制,若 base 值为16 则采用16 进制数等。当 base 的值为 0 时,默认采用 10 进制转换,但如果遇到 '0x' / '0X'(@”0x22“) 前置字符则会使用 16 进制转换,遇到 '0' @“022“)前置字符则会使用 8 进制转换。


        //返回的结果就是:2216进制等于多少;【返回值】返回转换后的无符号长整型数;如果不能转换或者 str 为空字符串,那么返回 0;如果转换得到的值超出unsigned long int 所能表示的范围,函数将返回 ULONG_MAX(在 limits.h 头文件中定义),并将 errno 的值设置为 ERANGE


             //strtoul() 会扫描参数 str 字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过 isspace() 函数来检测),直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时('\0')结束转换,并将结果返回。

        

        unsigned long s =  strtoul([@"22" UTF8String], 0, 0);

        NSLog(@"---%tu",s);


       //==============================




    展开全文
  • strtoul

    2014-11-13 15:47:59
    定义函数:unsigned long int strtoul(const char *nptr, char **endptr, int base); 函数说明:strtoul()会将参数nptr 字符串根据参数base 来转换成无符号的长整型数。参数base 范围从2 至36,或0。参数base ...
  • 之前使用strtoul函数时,从来没思考过它的用法,最近在编写驱动设计时,突遇这个函数,发现这函数还是有值得探讨的地方。 其函数原型如下: unsigned long strtoul(const char *nptr,char **endptr,int base ) ...
  • strtol, strtoll, strtoul, strtoull convert a string to a (signed, unsigned ) long integer string 声明: #include ( 这个是C标准库,与linux无关。这套函数是通用的。) long int strtol(const ...
  • strtoul函数注意点

    2017-03-01 10:35:59
    strtoul
  • 首先我们通过man 3 strtoul命令在linux系统终端查看下该函数的原型如下 #include <stdlib.h> unsigned long int strtoul(const char *nptr, char **endptr, int base); 1.strtoul()函数的功能: 是将一个字符...
  • Linux中strtoul函数

    2018-02-23 10:11:23
    其函数原型如下:unsigned long strtoul(const char *nptr,char **endptr,int base )参数1:字符串起始地址参数2:返回字符串有效数字的结束地址,这也是为什么要用二级指针的原因。参数3:转换基数。当base=0,自动...
  • 二十三 strtoul函数

    2014-01-04 18:59:06
    unsigned long int strtoul(const char *nptr, char **endptr, int base); 先介绍下strtoul函数,它会从一个数字字符或是正负号字符开始,直到遇见非数字字符或字符串,停止读取,将已读取到的数字字符串,...
  • strtoul函数的用法

    2018-06-25 10:16:12
    strtoul() 函数源自于“string to unsigned long”,用来将字符串转换成无符号长整型数(unsigned long),其原型为: unsigned long strtoul (const char* str, char** endptr, int base);【参数说明】str 为要转换...
  • strtoul()函数

    2020-07-30 16:51:38
    C语言 strtoul()函数 ------ 字符串转换成无符号长整型 unsigned long int strtoul(const char *str, char **endptr, int base) 把参数str所指向的字符串根据给定的base转换为一个无符号长整数. 参数: str-- 要...
  • Linux内核中提供的一些字符串转换函数: lib/vsprintf.c 1. unsigned long long simple_strtoull(const char *cp, char **endp, unsigned ... 2. unsigned long simple_strtoul(const char *cp, char **endp, u
  • strtoul.c因为上面的文件用到了strtoul.c,所以就直接分析这个文件。说实话,还是调试时,看代码较快。我于是写了一个mainint main(){ char *s="0123"; long num; int c; c=strtoul(s,0,8); printf...
  • strtoul和errno的合作

    2017-11-17 14:46:29
    最近在使用strtoul时,碰到了一个让我没有想到的问题。 费了很大的功夫,最后才发现是这个小小的errno的问题。 吃一堑,长一智,特此写出来和大家分享一下。废话不多说,下面开始干货。strtoul (将字符串转化成无...
  • Linux strict_strtoul 函数

    2017-10-12 12:49:14
    strict_strtoul函数所在位置:kernel/include/linux/kernel.h find./−name“∗.h”|xargsgrep“strictstrtoul”find ./ -name “*.h” | xargs grep “strict_strtoul” ./include/linux/kernel.h:#define strict...
  • eg:NSString *strtest =@"7fffffff";... NSUInteger val = strtoul([[strtest substringWithRange:NSMakeRange(0, 8)] UTF8String], 0, 16); NSLog(@"val = %d", val);打印结果:2015-09-28 17:26:51.420 iOSTest[28
  • strtoul():将字符串转为长整型整数 atoi():将字符串转为整型整数 在32位STM32中,int是32位的,如果字符串是“3123456789”,大于0x7fff fff,用atoi()函数返回的值就是0x7fff fff,而使用strtoul就能返回正确的...
  • 作用:利用函数strtoul(const char *, char **, int),通过对应的进制格式,将字符串转换成十进制 char* p;//定位字符串转换终止的位置 unsigned long s = strtoul("FFt6", &p, 16); NSLog(@"%lu",s); NSLog(@"%...
1 2 3 4 5 ... 20
收藏数 7,269
精华内容 2,907
关键字:

strtoul