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

C语言 strtol() 函数用法

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.hskmm.com/?act=detail&tid=27025

相关文章:

  • 课程作业
  • 国庆七日赛训总结
  • SpringCloud实用篇02-(Nacos配置管理,Feign远程调用,Gateway服务网关) - a
  • 总资料汇总关联化站点形式的尝试(未完成)
  • 8051指令集
  • reLeetCode 热题 100- 76 最小覆盖串 - MKT
  • SpringCloud-01(认识微服务,服务拆分和远程调用,Eureak注册中心,Ribbon负载均衡,Nacos注册中心) - a
  • 算法第一次作业
  • C++_高阶
  • 使用Quarkus构建首个Keycloak MCP服务器实战指南
  • AI数据管道同步引擎技术解析
  • 几个重要的偏微分方程(三)
  • 树状数组求逆序数原理_杂谈
  • 20232427 2025-2026-1 《网络与系统攻防技术》实验一实验报告
  • 墨西哥证券交易所(BMV)等多个交易所股票数据API对接文档
  • Kubernetes技术详解-从理论到实践-(5)-控制器-Deployment - 详解
  • P5664 [CSP-S2019] Emiya 家今天的饭 题解
  • PWN手的成长之路-11-CISCN 2019华北 PWN1-栈溢出
  • sensitive-word:一个简单易用的敏感词过滤框架
  • 回归学习——包机制
  • vue 组件的常见8种通信方式
  • vue一键安装
  • 如何使用 ManySpeech 调用 SenseVoiceSmall 模型
  • 维基框架 (Wiki Framework) v1.1.2 | 企业级微服务开发框架
  • 国庆假期总结
  • CF1738E Balance Addicts
  • 2025浇注型聚氨酯厂家最新推荐榜:聚氨酯胶黏剂/聚氨酯胶辊/聚氨酯制品/聚氨酯原料/液体聚氨酯/聚氨酯浇注料/聚氨酯ABC料/浇筑聚氨酯/聚氨酯预聚物全场景实力厂家
  • C语言设计模式-策略模式
  • 动态张量运算自动优化技术解析
  • 【PhysUnits】15.9 引入P1后的右移运算(shr.rs) - 详解