最近在使用strtoul时,碰到了一个让我没有想到的问题。
费了很大的功夫,最后才发现是这个小小的errno的问题。
吃一堑,长一智,特此写出来和大家分享一下。
废话不多说,下面开始干货。
strtoul (将字符串转化成无符号长整型)
表头文件
#include<stdlib.h>定义函数
unsigned long strtoul(const char *nptr,char **endptr,int base);主要功能
strtoul()会将参数nptr字符串根据参数base来转换成无符号的长整型数。参数base范围从2至36,或0。参数base代表采用的进制方式,如base值为10则采用10进制,若base值为16则采用16进制数等。
返回值
返回转换后的长整型数,否则返回ERANGE并将错误代码存入errno中。
附加说明
ERANGE指定的转换字符串超出合法范围。
所以一般使用strtoul时,为了判断字符串是否转换成功,会根据errno的返回值进行判断。
例:
str_tmp = strtoul(str, &tmp, 10); if ((errno != 0) || (strlen(tmp) != 0)) { break;}那么问题来了,这个errno使用之前是否应该初始化一下?
^_^
我这次碰到的问题就是没有初始化,因为errno是一个全局变量,所以在你使用之前可能别的代码已经发生过错误从而改变了它的值,导致你的程序走到这里会发生错误。(这就是最悲催的,明明不是你的问题,却显示你的程序出现了问题。)