当前位置: 首页 > news >正文

C语言中的字符串转数字函数常见问题详解

目录

  • C语言中的字符串转数字函数常见问题详解
    • 字符串转整形
      • atoi函数
    • 字符串转长整形
      • strtol函数,

C语言中的字符串转数字函数常见问题详解

字符串转整形

atoi函数

函数原型:

	int atoi(const char *nptr);

该函数是把字符串转换成整型数的一个函数,函数会扫描参数 nptr字符串,自动跳过前面的空白字符(例如空格,tab缩进)等。如果 nptr不能转换成 int 或者 nptr为空字符串,那么将返回 0 [1] 。

该函数常犯的问题是它的几个默认项,

  1. 该函数要求被转换的字符串是按十进制数理解的。
  2. 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。
使用中常犯的几个错误集中在他的几个默认选项,

  1. base值为16则采用16进制,当base值为0时则是采用10进制做转换,
  2. ’0x’前置字符则会默认使用16进制
  3. ’0’前置字符而不是’0x’的时候会使用8进制做转换
  4. strtol()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换.
  5. 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的习惯。

相关文章:

  • 从零开始搭建仿抖音短视频APP-构建后端项目
  • 力扣 221. 最大正方形
  • 爬虫报错:twisted.web._newclient.ResponseNeverReceived
  • 前后端分离技术渲染动态页面 - 表白墙(Servlet)
  • 关于springboot多环境设设置说明
  • 一幅长文细学CSS3
  • P2-Net:用于2D像素与3D点匹配的局部特征的联合描述符和检测器(ICCV 2021)
  • 电磁兼容(EMC)基础(二)
  • 面向终客户和设备制造商的Ethernet-APL
  • React.lazy与Suspence实现延迟加载
  • React 中 memo useMemo useCallback 到底该怎么用
  • git命令