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

字符串相关函数

字符串相关函数(数值转字符串、字符串转数值)

一、字符串转数值函数

1. 基本转换函数

  • atoi(const char *str):将字符串转为int类型
  • atol(const char *str):将字符串转为long int类型
  • atoll(const char *str):将字符串转为long long int类型
  • atof(const char *str):将字符串转为double类型

这些函数会跳过开头的空白字符,直到遇到数字或正负号开始转换,遇到非数字字符停止。

2. 更灵活的转换函数

  • strtol(const char *str, char **endptr, int base):转换为long int,支持指定进制(2-36)
  • strtoll(const char *str, char **endptr, int base):转换为long long int
  • strtod(const char *str, char **endptr):转换为double
  • strtof(const char *str, char **endptr):转换为float

这些函数通过endptr参数可以获取转换停止的位置,便于错误处理。

二、数值转字符串函数

  • sprintf(char *str, const char *format, ...):将格式化的数值写入字符串
  • snprintf(char *str, size_t size, const char *format, ...):类似sprintf,但限制最大写入字节数,更安全
  • itoa(int value, char *str, int base):非标准函数,将整数转为指定进制的字符串(某些编译器支持)

三、扩展示例代码

代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>// 字符串转整数并处理错误
int str_to_int(const char *str, int *result) {char *endptr;long val;errno = 0;val = strtol(str, &endptr, 10);// 检查各种可能的错误if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN)) || (errno != 0 && val == 0)) {perror("转换错误");return 0;}if (endptr == str) {fprintf(stderr, "没有有效的数字\n");return 0;}// 检查是否超出int范围if (val > INT_MAX || val < INT_MIN) {fprintf(stderr, "数值超出int范围\n");return 0;}*result = (int)val;return 1;
}// 字符串转浮点数并处理错误
int str_to_double(const char *str, double *result) {char *endptr;errno = 0;*result = strtod(str, &endptr);if ((errno == ERANGE && (*result == HUGE_VAL || *result == -HUGE_VAL)) || (errno != 0 && *result == 0)) {perror("转换错误");return 0;}if (endptr == str) {fprintf(stderr, "没有有效的数字\n");return 0;}return 1;
}// 整数转字符串
void int_to_str(int num, char *buffer, size_t size) {snprintf(buffer, size, "%d", num);
}// 浮点数转字符串
void double_to_str(double num, char *buffer, size_t size, int precision) {char format[20];snprintf(format, sizeof(format), "%%.%df", precision);snprintf(buffer, size, format, num);
}int main() {// 1. 字符串转数值示例printf("===== 字符串转数值示例 =====\n");// 基本整数转换const char *int_str = "12345";int int_val;if (str_to_int(int_str, &int_val)) {printf("字符串 \"%s\" 转换为整数: %d\n", int_str, int_val);}// 带符号的整数const char *signed_str = "-9876";if (str_to_int(signed_str, &int_val)) {printf("字符串 \"%s\" 转换为整数: %d\n", signed_str, int_val);}// 浮点数转换const char *float_str = "3.1415926535";double double_val;if (str_to_double(float_str, &double_val)) {printf("字符串 \"%s\" 转换为浮点数: %.6f\n", float_str, double_val);}// 科学计数法const char *sci_str = "1.234e5";if (str_to_double(sci_str, &double_val)) {printf("字符串 \"%s\" 转换为浮点数: %.2f\n", sci_str, double_val);}// 错误转换示例const char *error_str = "123abc";if (str_to_int(error_str, &int_val)) {printf("字符串 \"%s\" 转换为整数: %d\n", error_str, int_val);} else {printf("字符串 \"%s\" 转换失败\n", error_str);}// 2. 数值转字符串示例printf("\n===== 数值转字符串示例 =====\n");int num = -54321;char str[50];int_to_str(num, str, sizeof(str));printf("整数 %d 转换为字符串: \"%s\"\n", num, str);double fnum = 2.718281828;double_to_str(fnum, str, sizeof(str), 4);printf("浮点数 %.6f 转换为字符串(保留4位小数): \"%s\"\n", fnum, str);// 格式化转换int hex_num = 255;snprintf(str, sizeof(str), "十进制: %d, 十六进制: 0x%x, 八进制: 0%o", hex_num, hex_num, hex_num);printf("多格式转换: \"%s\"\n", str);return 0;
}

运行结果
在这里插入图片描述

代码说明

这个示例包含以下特点:

  1. 封装的转换函数
    • str_to_int:字符串转整数,包含完整的错误处理
    • str_to_double:字符串转浮点数,处理各种错误情况
    • int_to_str:整数转字符串
    • double_to_str:浮点数转字符串,可指定精度
  2. 全面的错误处理
    • 检查范围错误(ERANGE)
    • 检查无效输入(无有效数字)
    • 检查整数溢出(超出 int 范围)
  3. 多样化转换示例
    • 基本整数转换
    • 带符号整数转换
    • 浮点数转换
    • 科学计数法转换
    • 错误输入处理
    • 多格式数值转字符串
  4. 安全实践
    • 使用snprintf代替sprintf防止缓冲区溢出
    • 明确指定缓冲区大小
    • 处理各种边界情况
http://www.dtcms.com/a/293055.html

相关文章:

  • visual studio 性能调试
  • 大数据之Hive:Hive中week相关的几个函数
  • 【Java】SVN 版本控制软件的快速安装(可视化)
  • Qt中的栅格布局的核心机制与栅格布局中的元素隐藏后重新排列布局解决方案解析
  • 基于CH32V203F8P6 interface_debug_print支持浮点格式输出
  • 模型优化-------模型压缩
  • Python之格式化Conda中生成的requirements.txt
  • timesFM安装记录
  • JavaWeb学习打卡10(HttpServletRequest详解应用、获取参数,请求转发实例)
  • PyTorch常用工具
  • 我的第一个开源项目 -- 实时语音识别工具
  • C++中的list(2)简单复现list中的关键逻辑
  • 水电站自动化升级:Modbus TCP与DeviceNet的跨协议协同应用
  • CMake实践:CMake3.30版本之前和之后链接boost的方式差异
  • 渗透部分总结
  • 从 COLMAP 到 3D Gaussian Splatting
  • vue2的scoped 原理
  • Flex/Bison(腾讯元宝)
  • 开源AI智能客服、AI智能名片与S2B2C商城小程序在客户复购与转介绍中的协同效应研究
  • 禁食时长与关键生物反应的相对强度对照表
  • syscall函数用法
  • Java 中 String 类的常用方法
  • JavaScript的进阶学习--函数和基本对象的解析
  • 16-MSTP
  • 加速度计输出值的正负号与坐标系正方向相反
  • 基于 Agent 的股票分析工具
  • Windows Server 设置MySQL自动备份任务(每日凌晨2点执行)
  • 洛谷刷题7..22
  • 贪心算法Day3学习心得
  • VBScript 拖拽文件显示路径及特殊字符处理