C语言 strtol() 函数用法

news/2025/11/15 15:25:21/文章来源:https://www.cnblogs.com/FBsharl/p/19130304

strtol 是 C 标准库中的一个重要函数,用于将字符串转换为长整数。下面解释这个函数:

函数原型

long int strtol(const char* str, char** endptr, int base);

参数说明

1. str - 要转换的字符串

  • 指向【以 null 结尾的字符串】的指针(非常重要:请确保输入字符串以 null 结尾)

  • 函数会跳过前面的空白字符

2. endptr - 结束指针(可选)

(主要的作用:用于输入错误检测)

  • 如果非 NULL,函数会将第一个无效字符的地址存储在这里

  • 如果为 NULL,则忽略此信息

3. base - 进制基数

  • 2-36:指定转换的进制

  • 0:自动检测进制(根据字符串前缀)

    • 0x 或 0X:十六进制

    • 0:八进制

    • 其他:十进制

返回值

  • 成功:转换后的长整数值

  • 失败:0 或 LONG_MAX/LONG_MIN(溢出时)

  • 设置 errno 来指示错误类型

使用示例

1. 基本转换

#include <stdlib.h>
#include <stdio.h>int main() {const char* str1 = "12345";const char* str2 = "0x1A3F";const char* str3 = "1010";//指定字符串和进制,进行数字的转换long num1 = strtol(str1, NULL, 10);  // 十进制: 12345long num2 = strtol(str2, NULL, 0);   // 自动检测: 6719long num3 = strtol(str3, NULL, 2);   // 二进制: 10//打印结果以十进制显示printf("num1 = %ld\n", num1);//结果:12345printf("num2 = %ld\n", num2);//结果:6719printf("num3 = %ld\n", num3);//结果:10return 0;
}

2. 使用 endptr 检测转换结果下载

#include <stdlib.h>
#include <stdio.h>int main() {const char* str = "123abc";char* endptr;long num = strtol(str, &endptr, 10);printf("转换的数字: %ld\n", num);    // 123printf("剩余字符串: \"%s\"\n", endptr); // "abc"printf("转换的字符数: %td\n", endptr - str); // 3return 0;
}

3. 错误处理

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <limits.h>int main() {const char* str1 = "99999999999999999999"; // 超出 long 范围const char* str2 = "invalid";char* endptr;errno = 0; // 重置错误标志long num1 = strtol(str1, &endptr, 10);if (errno == ERANGE) {printf("数值超出范围\n");if (num1 == LONG_MAX)printf("上溢发生\n");else if (num1 == LONG_MIN)printf("下溢发生\n");}errno = 0;long num2 = strtol(str2, &endptr, 10);if (endptr == str2) {printf("没有数字被转换\n");}return 0;
}

在原代码中的应用

outputArray[outputSize++] = strtol(byteStr, nullptr, 16);

这里的使用:

  • byteStr:包含两个十六进制字符的字符串(如 "1A")

  • nullptr:不关心结束位置

  • 16:明确指定十六进制转换

转换过程:

  • "1A" → 1*16 + 10 = 26 → 0x1A

  • "FF" → 15*16 + 15 = 255 → 0xFF

  • "00" → 0*16 + 0 = 0 → 0x00

相关函数家族

 
函数 返回类型 说明
strtol long 转换到长整数
strtoll long long 转换到长长整数
strtoul unsigned long 转换到无符号长整数
strtod double 转换到双精度浮点数
atoi int 简单转换(不检查错误)

重要注意事项

  1. 错误处理:总是检查 errno 和 endptr

  2. 边界检查:确保输入字符串以 null 结尾

  3. 进制选择:使用 0 让函数自动检测通常更安全

  4. 性能:比 atoi 慢但更安全,支持错误检测

strtol 是一个强大而灵活的函数,特别适合需要健壮错误处理的场景。

 
 
 
 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/174185.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

课程作业

课程作业这个作业属于哪个课程 https://edu.cnblogs.com/campus/zjlg/25rjjc这个作业的目标 介绍自己并确立课程目标姓名-学号 潘均昊 2023329301031自我介绍: 大家好,我是浙江理工大学2023级自动化1班的潘均昊,我是…

task2.c

task2.cinclude <stdio.h> int main() { double a, b, c; scanf_s("%lf%lf%lf" , &a, &b, &c); if (a + b > c and a + c > b and b + c > a)printf("能构成三角形\n"…

SpringCloud实用篇02-(Nacos配置管理,Feign远程调用,Gateway服务网关) - a

SpringCloud实用篇02-(Nacos配置管理,Feign远程调用,Gateway服务网关) 目录SpringCloud实用篇02-(Nacos配置管理,Feign远程调用,Gateway服务网关)0.学习目标1.Nacos配置管理1.1.统一配置管理1.1.1.在nacos中添…

reLeetCode 热题 100- 76 最小覆盖串 - MKT

reLeetCode 热题 100- 76 最小覆盖串 自己 滑动窗 class Solution { public: // 自己第一个 5% 时间满 内存64% 动态滑动窗string minWindow1(string s, string t) {if(s.size()<t.size()){return "";}v…

SpringCloud-01(认识微服务,服务拆分和远程调用,Eureak注册中心,Ribbon负载均衡,Nacos注册中心) - a

SpringCloud01 目录SpringCloud011.认识微服务1.0.学习目标1.1.单体架构1.2.分布式架构1.3.微服务1.4.SpringCloud1.5.总结2.服务拆分和远程调用2.1.服务拆分原则2.2.服务拆分示例2.2.1.导入Sql语句2.2.2.导入demo工程…

task.1_2.c

task.1_2.c//task1_2.c include <stdio.h> int main() { printf("%s\t%s\t\n"," 0"," 0"); printf("%s\t%s\t\n","", ""); printf("%s\t%s\t…

使用Quarkus构建首个Keycloak MCP服务器实战指南

本文详细介绍了如何使用Quarkus框架构建一个基于Model Context Protocol的Keycloak管理服务器,包含完整的代码实现、工具定义和部署流程,帮助开发者理解MCP协议在实际项目中的应用。A Keycloak示例 - 使用Quarkus构建…

AI数据管道同步引擎技术解析

本文详细介绍了一种新型数据同步引擎技术,它能够整合分布式计算服务,构建统一数据层,解决非结构化数据接入AI管道的难题,通过并行架构支持快速扩展,降低企业AI应用成本。某机构SyncEngine助力AI代理获取多源非结构…

20232427 2025-2026-1 《网络与系统攻防技术》实验一实验报告

一、实验目的 篡改程序流程——直接修改可执行文件,跳转至getShell; 栈溢出攻击——利用foo函数的缓冲区溢出漏洞,覆盖返回地址触发getShell; Shellcode注入——构造恶意输入注入自定义Shellcode并执行。 二、基础…

PWN手的成长之路-11-CISCN 2019华北 PWN1-栈溢出

远程连接以下靶机,看看交互。file 查看程序文件。checksec 查看程序文件安全属性。开启了 NX 保护,栈上不可执行。IDA 打开程序文件。查看 ain 函数,发现调用了 func 函数。查看 func 函数。这里需要判断 v2 是否等…

sensitive-word:一个简单易用的敏感词过滤框架

这篇文章,分享一个开源项目:sensitive-word 。Github 地址:https://github.com/houbb/sensitive-wordsensitive-word 是一个功能强大的 Java 敏感词过滤框架,它不仅提供了基础的敏感词检测功能,还支持单词标签分类…

如何使用 ManySpeech 调用 SenseVoiceSmall 模型

一、模型与组件简介SenseVoice 模型多语言音频理解开源模型,支持语音识别、语种识别、情感识别等功能,适用于中、粤、英、日、韩等语言。 ManySpeech.AliParaformerAsrC# 语音识别推理库,支持 paraformer-large、pa…

国庆假期总结

🎉国庆总览🎉 学习🎯被学习充满的假期真是太充实(无聊)了机器学习。学习了吴恩达的机器学习,看了一百多集,实践做了小部分,我感觉到只学习到了皮毛,难的。其实只是选修课而已在这个学期,但是我想这是专业…

2025浇注型聚氨酯厂家最新推荐榜:聚氨酯胶黏剂/聚氨酯胶辊/聚氨酯制品/聚氨酯原料/液体聚氨酯/聚氨酯浇注料/聚氨酯ABC料/浇筑聚氨酯/聚氨酯预聚物全场景实力厂家

在当今工业材料领域,浇注型聚氨酯作为一种高性能弹性体材料,因其优异的耐磨性、耐油性和机械强度,在机械制造、矿山设备、印刷包装等行业得到广泛应用。随着市场需求持续增长,如何从众多厂家中筛选出优质供应商成为…

动态张量运算自动优化技术解析

本文介绍了一种名为DietCode的新型自动调度器,能够高效处理动态形状的张量运算,将优化过程加速6倍以上,同时使生成代码性能提升高达70%,显著提升机器学习工作效率。自动优化动态张量运算的执行 深度学习模型核心依…

多线程插入也是随机io,那为啥不用uuid

多线程插入也是随机io,那为啥不用uuid首先,并发写入确实是随机io,但是uuid带来的页分裂更恶劣 而多线程并发写入有序id,操作系统有办法优化老实说ds说的有点牵强

[论文阅读]PPT: Backdoor Attacks on Pre-trained Models via Poisoned Prompt Tuning - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

10. 模型与视图

一、模型与视图模型/视图架构包含三部分:模型(Model)是应用对象,用来表示数据;视图(View)是模型的用户界面,用来显示数据;委托(Delegate,也被称为 代理)可以定制数据的渲染和编辑方式。通过数据和界面进行…

[KaibaMath]1004 关于f(x,y) = [x]+[y] - [x+y]的平移稳定性

[KaibaMath]1004 关于f(x,y) = [x]+[y] - [x+y]的平移稳定性令f(x,y) = [x]+[y] - [x+y], g(x, y) = {x} + {y} - {x+y},则f(x, y) + g(x, y)= 0。 注意f(x, y)和g(x, y)均具有平移稳定性。 例如:f(x+M, y+N) = f(x,…

2025.10 国庆集训模拟赛总结

把门视为点,找环,答案就是环的长度先预处理前缀和 然后预处理f[i]表示满足j<i且aj==ai的最大的j。 答案就变成了:第一问用树套树类结构维护 第二问直接二分第一问就行,因为第一问我们在先做了。 树套树太难写,…