关于stroul函数

来源:互联网 发布:淘宝卖家信息采集器 编辑:程序博客网 时间:2024/06/05 06:18

            今天在测试服务程序时,发现收到数据包中时间处理老是出错,通过打印日志,发现在程序将数据包中字符串表示的“时分秒”转为u_long时出错,该转换我使用了strtoul函数,该函数原型是:

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

              以前一直记得该函数解释如下:

             strtoul()会将参数nptr字符串根据参数base来转换成无符号的长整型数。参数base范围从2至36,或0。参数base代表采用的进制方式,如base值为10则采用10进制,若base值为16则采用16进制数等。当base值为0时则是采用10进制做转换,但遇到如'0x'前置字符则会使用16进制做转换。一开始strtoul()会扫描参数nptr字符串,跳过前面的空格字符串,直到遇上数字或正负符号才开始做转换,在遇到非数字或字符串结束符(‘\0')时结束转换,并将结果返回件而终止的nptr中的字符指针由。若参数endptr不为NULL,则会将遇到不合条endptr返回,如果转换成功,则返回转换后的长整型数,否则返回ERANGE并将错误代码存入errno中。

我的程序出错日志如下:

      [strTime='015705' uTime=7109]

通过其他数据测试发现,只有当输入字符串第一位为0时,才出错,我把strtoul函数源代码打开,终于找到了问题:

/** Recognize number prefix and if BASE is zero, figure it out ourselves.  */  if (*s == L_('0'))  {    if ((base == 0 || base == 16) && TOUPPER (s[1]) == L_('X'))    {      s += 2;      base = 16;    }    else if (base == 0)       base = 8;    }  else if (base == 0)    base = 10;  }

从源码可看出,在参数base=0时,函数在跳过前面的空字符后,如果字符串以0X开头,则以16进制转换,如果字符串以0(非0X)开头,则以8进制转换,其他情况

才以10禁止转换。果然7109转为8进制时,确实是15705。

结论:所以以后使用stroul,strol等函数转换时,如果确定数据进制,还是老老实实的把base设置好!