strtol

2023-05-16

转自:http://hi.baidu.com/qwpsmile/blog/item/9bc44efa4f41018a9f514637.html

今天,在review 一些代码的时候,看到了strtol()这个函数,由于以前使用它的时候,还没有深刻的了解,这次,我决定探个究竟。

网上关于这个函数的资料大都来源于同份资料,linux库函数,讲的不够细致。于是,我花了几个小时,认真地尝试其功能,并整理了这篇文章,希望能对C语言的爱好者一些帮助。

希望大家能够将本文中发现的错误及时反馈给我,以便修正。我的信箱是wp.qin@sunmedia.com

+----------------+
|      strtol             |
+----------------+

i.e. string to long

long int strtol(const char *nptr, char **endptr, int base)
strtol()
会将nptr指向的字符串,根据参数base((base,把数据当作base进制的数来看待)),按权转化为long int, 然后返回这个值。

参数base的范围为2~36,0;它决定了字符串以被转换为整数的权值。
可以被转换的合法字符依据base而定,举例来说,当base2时,合法字符为‘0’‘1’base8时,合法字符为‘0’‘1’……‘7’base10时,合法字符为‘0’‘1’……‘9’base 16时,合法字符为‘0’‘1’……‘9’‘a’……‘f’base24时,合法字符为‘0’……‘9’‘a’……‘n’base36时,合法字符为‘0’……‘9’‘a’……‘z’;等等。其中,不区分大小写,比如,‘A’‘a’会都会被转化为10
当字符合法时,‘0’……‘9’依次被转换为十进制的09‘a’……‘z’一次北转换为十进制的1035
strtol()
函数检测到第一个非法字符时,立即停止检测,其后的所有字符都会被当作非法字符处理。合法字符串会被转换为long int, 作为函数的返回值。非法字符串,即从第一个非法字符的地址,被赋给*endptr**endptr是个双重指针,即指针的指针。strtol()函数就是通过它改变*endptr的值,即把第一个非法字符的地址传给endptr

多数情况下,endptr设置为NULL, 即不返回非法字符串。
下面看几个例子:
------------------------------------------------------
char buffer[20]="10379cend$3";
char *stop;
printf("%d/n",strtol(buffer, &stop, 2));
printf("%s/n", stop);
输出结果:

2
379cend$3    cute
:二进制10是十进制的2-------------------------------------------------------
char buffer[20]="10379cend$3";
char *stop;
printf("%d/n",strtol(buffer, &stop, 8));
printf("%s/n", stop);
输出结果:

543
9cend$3      cute
8进制1037是十进制的543
--------------------------------------------------------
char buffer[20]="10379cend$3";
char *stop;
printf("%d/n",strtol(buffer, &stop, 10));
printf("%s/n", stop);
输出结果:

10379
cend$3            cute
:十进制的10379是十进制的10379
-------------------------------------------------------
char buffer[20]="10379cend$3";
char *stop;
printf("%d/n",strtol(buffer, &stop, 16));
printf("%s/n", stop);
输出结果:

17005006              cute
:十六进制的10379ce是十进制的17005006
nd$3
另外,如果base0且字符串不是0x(或者0X)开头,则按十进制进行转化如果base0或者16,并且字符串以0x(或者0X)开头,那么,x(或者X)被忽略,字符串按16进制转化如果base不等于016,并且字符串以0x(或者0X)开头,那么x被视为非法字符。

例如:
-------------------------------------------------------
char buffer[20]="0x31da6c";
char *stop;
printf("%d/n",strtol(buffer, &stop, 0));
printf("%s/n", stop);
输出结果(stop为空)

3267180

-------------------------------------------------------
char buffer[20]="0x31da6c";
char *stop;
printf("%d/n",strtol(buffer, &stop, 13));
printf("%s/n", stop);
输出结果:

0
0x31da6c
-------------------------------------------------------

最后,需要说明的是,对于nptr指向的字符串,其开头和结尾处的空格被忽视,字符串中间的空格被视为非法字符
例如:
-------------------------------------------------------
char buffer_1[20]="10379c";
char buffer_2[20]="      10379c        ";
char buffer_3[20]="      10      379c        ";
printf("%d/n",strtol(buffer_1,NULL,0));
printf("%d/n",strtol(buffer_2,NULL,0));
printf("%d/n",strtol(buffer_3,NULL,0));
输出结果为:
10379
10379
10

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

strtol 的相关文章

  • 开源 apm_使用开源APM软件:InspectIT

    开源 apm 在当今时代 xff0c 软件系统不断变得越来越复杂 同时 xff0c 客户对响应时间和可用性的期望比以往更高 如您所知 xff0c 性能不佳的服务可能会将客户吸引到竞争对手的产品中 因此 xff0c 系统故障和性能不佳通常会对
  • 啦啦啦啦啦_开放组织读书俱乐部:啦啦队长如何设定方向

    啦啦啦啦啦 我们终于进入了为期7周的开放式组织虚拟图书俱乐部的第7章 xff0c 催化方向 在前几周 xff0c 我们讨论了开放组织的原因和方式 与启动上周的包容性决策的讨论 xff0c 我们一头扎进了 自下而上 的组织模式是什么成分 现在
  • cisco路由器vty_如何使用VTY Shell配置路由器

    cisco路由器vty 最近 xff0c 我写了一篇文章 xff0c 解释了如何使用Quagga路由套件实现开放式最短路径优先 xff08 OSPF xff09 可以使用多个软件套件代替Quagga来实现不同的路由协议 一种这样的选择是自由
  • powerdns_使用PowerDNS为名称服务器轻松配置DNS

    powerdns 几个月前 xff0c 我们要求为新项目提供稳定可靠的域名系统 xff08 DNS xff09 服务器 该项目使用容器进行自动部署 xff0c 每个新环境将在其中生成唯一的随机URL 在对可能的解决方案进行了大量研究之后 x
  • 人工智能革命(下):永生还是毁灭

    导读 xff1a 本系列文章讲述了人工智能革命的爆发以及人类未来的出路 xff0c 由于篇幅较长分为上下两篇 xff0c 原英文载于神奇的网站 WaitButWhy com xff0c 作者Tim Urban还写过一篇有关脑机接口的文章 N
  • rust vs java_为什么我喜欢以Java程序员的身份学习Rust

    rust vs java 自从我正确地学习了计算机或人类这门新语言以来 xff0c 已经很长时间了 也许25年 那是Java语言 xff0c 尽管与此同时我不得不写一点点C xff08 很少 xff09 和JavaScript xff0c
  • git-cola使用教程_使用Git Cola轻松实现Git

    git cola使用教程 Git是一个Linux命令 xff0c 可帮助您管理工作的版本 它已被移植到BSD xff0c macOS xff0c Windows等 它是流行的代码托管服务的基础 xff0c 包括GitLab和NotABug等
  • .net 开发使用什么语言_如何开始使用.NET开发

    net 开发使用什么语言 NET框架由Microsoft在2000年发布 该平台的开源实现Mono在2000年代初一直是争议的中心 xff0c 因为Microsoft拥有 NET技术的多项专利 xff0c 并且可以使用这些专利终止Mono的
  • linux重启命令_3条命令重启Linux(另外4种安全方式)

    linux重启命令 Linux完全有能力运行 xff0c 而不需要数周 xff0c 而是数年 xff0c 而无需重新启动 在某些行业中 xff0c 这正是Linux的功能 xff0c 这要归功于kpatch和kgraph之类的进步 但是 x
  • crazy pony_Pony编程语言简介

    crazy pony 在Wallaroo Labs xff08 我是工程副总裁 xff09 xff0c 我们正在构建以Pony编程语言编写的高性能 xff0c 分布式流处理器 大多数人都没有听说过Pony xff0c 但是对于Wallaro
  • html标记语言图像标记_为什么我喜欢这些标记语言

    html标记语言图像标记 去年大约这个时候 xff0c 我为本专栏文章简要介绍了各种标记语言 语言选择的话题最近出现了好几次 xff0c 所以我认为现在该是时候以我的偏见来重新讨论这个话题了 我在这里解释为什么我更喜欢我的语言 xff0c
  • 无人机开源项目_8个开源无人机项目

    无人机开源项目 编者注 xff1a 本文最初发表于2016年12月 xff0c 现已更新以包含其他信息 在过去的几年中 xff0c 对民用 xff0c 军事和商用无人机的兴趣Swift增长 xff0c 这也带动了制造商社区对开源无人机项目的

随机推荐

  • 开源协议 自主发展_开源推动科学发展的9个故事

    开源协议 自主发展 如今 xff0c 科学可能看起来更像开源 世界各地的研究人员和科学家都在呼吁获得免费许可的数据集 开放获取发布条件 xff1b 以及协作 xff0c 透明的同行评审 他们正在寻找开放源代码原则可以增强数字时代知识生产实践
  • 开源 word 替代_5种Google文档的开源替代品

    开源 word 替代 每天处理大量文档时 xff0c 无论您写什么 xff08 白皮书 xff0c 手册 xff0c 演示文稿 xff0c 不同的市场营销材料 xff0c 合同等 xff09 xff0c 都必须在某个时候 xff08 最常见
  • vscode快捷键 & java/c++环境

    vscode快捷键 amp java c 43 43 环境 vscode快捷键环境配置javac 43 43 个人习惯设置参考 vscode快捷键 快捷键功能Ctrl 43 Shift 43 P 或 F1显示所有命令Ctrl 43 空格触发
  • IIC通信协议(简单易理解版)

    IIC通信协议简介 xff1a IIC xff08 也记为I2C xff0c 读作I 2C xff0c inter integrated Circuit集成电路总线 xff0c 最早是飞利浦在1982年开发设计并用于自己的芯片上 xff0c
  • linux防病毒软件_十大Linux最佳防病毒软件-Linux防病毒软件列表!

    linux防病毒软件 Today s article is all about the best Antivirus for Linux But if Linux is so secure why do we need to have an
  • Python isinstance()

    Python isinstance function is used to check if an object is an instance of the specified class or not Python的isinstance
  • 使用git下载仓库_使用Git仓库

    使用git下载仓库 Whenever we start a project we will need to store all files in a repository So let 39 s start by first creatin
  • 在Raspberry Pi(ARM32)上的Docker中构建,运行和测试.NET Core和ASP.NET Core 2.1

    I love me some Raspberry Pi They are great little learning machines and are super fun for kids to play with Even if thos
  • 什么是Ubuntu LTS?与常规Ubuntu版本有何不同?

    Ubuntu distributions are released at given time intervals Every release has a code name that is related to an animal nam
  • 定义一个protobuf消息并生成Go代码

    大家好 xff01 让我们开始gRPC课程的动手部分 整个部分的目标是构建 个人计算机 Web服务 xff0c 该服务将使我们能够管理和搜索笔记本电脑配置 Here 39 s the link to the full gRPC course
  • 学科起源(漫画版)

    发几张收藏的图 xff0c 让大家对学科起源有点了解 xff0c 避免因学科纷争而引起不和 xff0c 生命科学也罢 xff0c 神经网络也罢都摆脱不了从物理和数学的角度去解释 xff0c 因为机器学习中很大的一部分 xff0c 尤其是神经
  • 【沧海拾昧】WiFi串口通信ESP8266模块基本介绍(附野火WiFi透传实例)

    C0104 沧海茫茫千钟粟 xff0c 且拾吾昧一微尘 沧海拾昧集 64 CuPhoenix 阅前敬告 沧海拾昧集仅做个人学习笔记之用 xff0c 所述内容不专业不严谨不成体系 如有问题必是本集记录有谬 xff0c 切勿深究 目录 前言一
  • linux shell

    转自 xff1a http blog csdn net fly sky520 article details 8853537 最近在linux下面编写shell脚本 xff0c 差不多是边学边写 在此记录一些学习心得 一 xff09 she
  • 软件开发遇到的难题_软件开发团队如何处理管理难题

    软件开发遇到的难题 通常是这样的 项目经理或产品负责人传达了来自公司食品链上层人士的消息 xff0c 即必须在给定日期之前交付软件 日期背后的原因可能是已知的 xff0c 但可能不是 反过来 xff0c 项目经理通知软件开发团队必须在该日期
  • Ubuntu20.04由于分辨率问题安装界面显示不完整

    使用vmware安装ubuntu的时候 xff0c 由于分辨率的问题 xff0c 导致安装界面显示不完整 xff0c button被隐藏 xff0c 无法进行下一步鼠标操作 同学遇到的问题 xff0c 迟迟不能解决 xff0c 参考别人的解
  • 数据结构排序算法及代码整理

    排序 xff1b 1 插入排序 xff08 直接插入排序和希尔排序 xff09 2 选择排序 xff08 直接选择排序和堆排序 xff09 3 交换排序 xff08 冒泡排序和快速排序 xff09 4 归并排序 5 基数排序 xff0d x
  • 排序算法性能比较

    各种排序方法的综合比较 结论 排序方法 平均时间 最坏时间 辅助存储 简单排序 O n2 O n2 O 1 快速排序 O nlogn O n2 O logn 堆排序 O nlogn O nlogn O 1 归并排序 O nlogn O nl
  • c++标准容器类(表格介绍)

    1 STL有6种序列容器类型 xff08 1 xff09 vector 它提供对元素的随即访问 xff0c 在尾部添加和删除元素的时间是固定的 xff0c 在头部或中部插入和删除元素的复杂度为线性时间 xff08 2 xff09 deque
  • 各大公司薪水一览表

    转自 http blog sina com cn s blog 4997a23a0100b2xc html 最近终于把自己给卖了 xff0c 这几个月来自己陆陆续续的面试的有30多家公司 xff0c 主要是IT公司 xff0c 准备把今年我
  • strtol

    转自 xff1a http hi baidu com qwpsmile blog item 9bc44efa4f41018a9f514637 html 今天 xff0c 在review 一些代码的时候 xff0c 看到了strtol 这个函