关于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设置好!
- 关于stroul函数
- stroul的作用
- atoi() atol()atof() strtol() stroul() strtod()
- 关于函数
- 关于函数
- 关于函数
- 关于函数
- 关于函数
- 关于函数
- 函数-关于javascript函数
- 关于随机函数
- 关于时间函数
- 关于main函数
- 关于main函数
- 关于UpdateData函数
- 关于复制构造函数
- 关于内联函数读书笔记
- 关于复制构造函数
- Vim 入门文档
- android中的handler例
- JavaGUI图形化界面外观模式设计资源库
- 为了小时候吹过的NB而奋斗
- surfaceflinger类图
- 关于stroul函数
- leokan神---USACO总结+所有题解
- 利用大恒DH-HV1351UM-ML数字摄像机设备进行单帧图像采集保存
- 九章 札记--C++ primer 之旅
- java基础之GUI编程
- 抽象类可以继承实体类吗?
- 计数排序
- JS常用校验方法
- Javascript中最常用的55个经典技巧