• strtoull函数的使用,及相关信息汇总


    kafka中涉及到序列化,有一个参数是在发送消息实体前边以一个序列号打头,

    seq = strtoull((prdcfgval+1), NULL, 10);

    do_seq = 1;


    其中(prdcfgval+1)为读取配置中该对应参数设置的值,strtoull函数是要把一个字符串转换成(unsigned)? long long int型的数,第三个参数表示以什么进制,,这儿是十进制;关于strtoull函数的详细解释如下:

    strtol,strtoll,strtoul, strtoull字符串转化成数字  

    名字:

    strtol, strtoll, strtoul, strtoull

    convert a string to a (signed, unsigned ) long integer string

    声明:

    #include<stdlib.h> ( 这个是C标准库,与linux无关。这套函数是通用的。)

    long int strtol(const char *nptr, char **endptr, int base);
    long long int strtoll(const char *nptr, char **endptr, int base);

    unsigned long int strtoul(const char *nptr, char **endptr, int base);
    unsigned long long int strtoull(const char *nptr, char **endptr, int base);                                          ?为啥我man strtoull 没有unsigned前缀

    说明,第一个参数 nptr是要转化的字符串。第三个参数base说明nptr的进制。base 取值范围 0,2-36

    这几个函数会忽略nptr前面的空格( ' ', ' ', ' ' 'f', 'v' ' ' ,由isspace判定为真的字符)

    while (*nptr && isspace ( *nptr ) ) ++ nptr;

    然后遇到非合法字符结束;

    base = 2; 合法字符为0, 1

    base = 3; 合法字符为0,1, 2

    ...

    base = 11; 合法字符为0,1,...,9,a(A)

    ...

    base = 36;合法字符为0, 1, ...,9,a(A),...,z(Z)。

    字符 a-z,是忽略大小写的,混着来也行,例如 strtol("aA", NULL, 11)依然能得到正确的结果。

    函数的第二个参数endptr可以为空,如果不为空,则 endptr 保存函数结束前的那个非合法字符的地址。

    如果没有合法字符,则 *endptr = nptr,函数返回0.

    例如:

    1.

    char *endptr;

    char nptr[]="123abc";

    int ret = strtol(npstr, &endptr, 10 );

    由于10进制里没有“数字”a,所以扫描到a,结束。

    这样 ret = 123;

    endptr = &nptr[3]; ( printf("%s", endptr);将得到字符串 abc )

    2.

    char nptr[]="     abc";

    int ret = strtol(nptr, &endptr, 10 );

    由于函数会忽略nptr前面的空格(' ', ' '...),所以,从字符a开始扫描,但是遇见的“第一个”即是不合法字符。

    所以函数结束。 ret=0; endptr = nptr;

      

    以下的讨论,会认为 nptr 前面没有空格,

    即执行过类似于while (*nptr  &&isspace ( *nptr ) ) ++ nptr;

    如果base 为0.则分3种情况:

    如果nptr 以0x(零x)开头,则把nptr当成16进制处理。

    如果npstr以0(零)开头,则把nptr当成8进制处理。

    否则,把nptr当成10进制。

      

    对于函数执行错误,如传了一个非合法base,则errno会设置相关值

     

  • 相关阅读:
    HDOJ 1284 钱币兑换问题 (求多重背包恰好装满总方案数)
    linux sysfs(1)
    这三天低效率开发的总结,我都做了些什么啊?
    达内C++培训课程
    [置顶] 81——复数类运算符的重载 double数据与复数之间的运算 任务三
    编码问题
    【IPAACV】MarrHildreth边缘检测器
    HashMap中的内容进行迭代输出
    低调 、隐忍、善良应是最应该修炼的
    windows下php7.1安装redis扩展以及redis测试使用全过程
  • 原文地址:https://www.cnblogs.com/the-tops/p/5886173.html
Copyright © 2020-2023  润新知