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

news/2024/7/5 2:55:58

目录

  • 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的习惯。


http://lihuaxi.xjx100.cn/news/91363.html

相关文章

Django后端开发:MVC 和 MTV以及动态路由、静态路由、自定义converters

目录 一、MVC和MTV 二、静态路由和动态路由 一、通过正则表达式来实现静态和动态路由 二、不适用正则表达式来实现静态和动态路由 一、常用的四种url路由 二、自定义转换器url路由类型 一、MVC和MTV MVC控制器Contorller部分,由Django框架的urlconf来实现 意思就是…

2022 需求工程复习真题【太原理工大学】

哈喽大家好&#xff0c;本篇是我整理出来的一些需求工程历年选择、填空真题&#xff0c;主要是针对期末考试用的&#xff0c;其余模块持续更新中&#xff0c;仅供参考&#xff01;>_< 目录 一、选择题 二、填空题 一、选择题 1.项目的前景和范围文档、用户需求文档都被…

Python 爬虫详解

一、爬虫概述 1、爬虫简介 要对数据进行处理和分析&#xff0c;首先就要拥有数据。在当今这个互联网时代&#xff0c;大量信息以网页作为载体&#xff0c;网页也就成了一个很重要的数据来源。但是&#xff0c;网页的数量非常之多&#xff0c;如果以人工的方式从网页上采集数据…

【SSM入门(二)】:setter依赖注入【超简单】

目录 &#x1f31e;测试结果 &#x1f31e;实现步骤 &#xff08;1&#xff09;建立空项目 ​编辑 &#xff08;2&#xff09;建立一个模块&#xff1a;maven项目 &#xff08;3&#xff09; 建立数据层dao和业务层service的接口和实现类文件 &#xff08;4&#xff09;UserDao…

WEB在线客服系统(websocket+Golang)

真正的大师,永远都怀着一颗学徒的心&#xff01; 一、项目简介 WEB在线客服系统&#xff0c;项目使用golang开发的&#xff0c;手机和电脑上都是可以自适应的。可以展示在网页页面右下角&#xff0c;只需要一段js代码&#xff0c;就可以实现功能。缩小后以悬浮的形式保留。 …

jQuery中的ajax

jquery中ajax XMLHttpRequest用法复杂&#xff0c;所以jquery对他进行封装&#xff0c;极大地降低了ajax的使用难度jquery对ajax发起请求三种方法 (1) $.get() 获取数据 (2) $.post() 提交数据 (3) $.ajax() 获取和提交数据 $.get() 语法&#xff1a; $.get(url,[data],[cal…

matlab画图(一、柱状图)

&#x1f40b; 前言&#xff1a;柱状图利用柱子的高度&#xff0c;反映数据的差异。肉眼对高度差异很敏感&#xff0c;辨识效果非常好。柱状图的局限在于只适用中小规模的数据集。 &#x1f42c; 目录: 一、数据获取二、简单柱状图三、分组柱状图四、堆叠柱状图 一、数据获取…

Android 内存溢出、垃圾回收、四种引用

内存溢出 内存溢出&#xff08;OutofMemory&#xff09;&#xff1a;系统会给每个APP分配内存也就是HeapSize值。当APP占用的内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存时就会抛出的OutOfMemory异常。 内存泄漏&#xff08;MemoryLeak&#xff09;&#xff1a;当…