C语言中的字符串转数字函数常见问题详解
目录
- C语言中的字符串转数字函数常见问题详解
- 字符串转整形
- atoi函数
- 字符串转长整形
- strtol函数,
C语言中的字符串转数字函数常见问题详解
字符串转整形
atoi函数
函数原型:
int atoi(const char *nptr);
该函数是把字符串转换成整型数的一个函数,函数会扫描参数 nptr字符串,自动跳过前面的空白字符(例如空格,tab缩进)等。如果 nptr不能转换成 int 或者 nptr为空字符串,那么将返回 0 [1] 。
该函数常犯的问题是它的几个默认项,
- 该函数要求被转换的字符串是按十进制数理解的。
- i输入的字符串对应数字存在大小限制,若其过大可能报错-1。
嵌入式常用的c语言中,int用二字节表示,范围是-32768~32767;
例如:
strcpy(str, "baidu.com");
val = atoi(str);
printf("字符串 = %s, 整型值 = %d\n", str, val);
运行后,得到:
字符串值 = baidu.com, 整型值 = 0
字符串转长整形
strtol函数,
函数声明为:
long int strtol(const char *nptr,char **endptr,int base);
将参数nptr字符串根据参数base来转换成长整型数,参数base范围从2至36。
使用中常犯的几个错误集中在他的几个默认选项,
- base值为16则采用16进制,当base值为0时则是采用10进制做转换,
- ’0x’前置字符则会默认使用16进制
- ’0’前置字符而不是’0x’的时候会使用8进制做转换
- strtol()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换.
- strtol()遇到非数字或字符串结束时(‘\0’)结束转换,并将转换数值返回。同时,参数endptr指向停止转换的位置,若字符串nptr的所有字符都成功转换成数字则endptr指向串结束符’\0’。
所以,判断是否转换成功,应检查**endptr是否为’\0’。
例如:
char * nptr =“1234”,base=0默认8进制转换,10和16对应10进制和16进制转换
而
char * nptr =“0x1234”,base=0默认16进制转换
同时,还要注意nptr的字符串转换后目标值得大小,C语言中long是4个字节,有两种表现形式:有符号和无符号。
有符号,long的表示数的范围为:-2147483648~2147483647
无符,long的表示数的范围为::0~4294967295
例如,我们常见的表示复数的长整型字符串表示为:
char * nptr =“FFFF1234”
如果使用strtol函数,返回的整数值超出long int的表示范围(上溢或下溢),则strtol返回它所能表示的最大(或最小)整数0x7FFFFFFF,并设置errno为ERANGE,
此时,如果确实需要转换为long int类型,应该转为无符号类型,应该使用strtoul()函数:将字符串转换成unsigned long(无符号长整型数),
函数原型:
unsigned long strtoul (const char* str, char** endptr, int base);
要想避免上述错误,要养成检查endptr和是否有errno的习惯。