嵌入式Linux系统编程 — 4.6 atoi、strtol等函数实现字符串与数字转换

目录

1 字符串转整形数据

1.1 函数功能

1.2 示例程序

2  字符串转浮点型数据

2.1 函数介绍

2.2 示例程序

3 数字转字符串

3.1 函数介绍

3.2 函数原型


在编程中,经常会需要将数字组成的字符串转换为相应的数字、或者将数字转换为字符串,在 C 函数库中同样也提供了相应的函数, 本小节就向大家介绍这些函数的用法。

1 字符串转整形数据

1.1 函数功能

C 函数库中提供了一系列函数用于实现将一个字符串转为整形数据,主要包括 atoi()、 atol()、 atoll()以及strtol()、 strtoll()、 strtoul()、 strtoull()等。下面是每个函数的详细原型、作用和参数解释:

atoi() 函数:将字符串 str 转换为整型 (int) 数值。

atol() 函数:将字符串 str 转换为长整型 (long) 数值。

atoll() 函数:将字符串 str 转换为长长整型 (long long) 数值。

int atoi(const char *str);
long atol(const char *str);
long long atoll(const char *str);
  • str:指向待转换的以字符串形式表示的整数的字符数组。

strtol() 函数:将字符串 str 转换为长整型 (long) 数值,支持指定基数。

strtoll() 函数:将字符串 str 转换为长长整型 (long long) 数值,支持指定基数。

strtoul() 函数:将字符串 str 转换为无符号长整型 (unsigned long) 数值,支持指定基数。

strtoull() 函数:将字符串 str 转换为无符号长长整型 (unsigned long long) 数值,支持指定基数。

long strtol(const char *str, char **endptr, int base);
long long strtoll(const char *str, char **endptr, int base);
unsigned long strtoul(const char *str, char **endptr, int base);
unsigned long long strtoull(const char *str, char **endptr, int base);
  • str:指向待转换的字符串。
  • endptr:如果非空指针,函数在这里存储一个指向第一个无法进行转换的字符的指针。
  • base:数值基数,范围从2到36。如果为0,基数将从字符串中推断(例如,"0x"前缀表示16进制)。

1.2 示例程序

下面的示例程序使用 atoi()atol()atoll()strtol()strtoll()strtoul()strtoull() 函数将用户通过键盘输入的字符串转换为不同的整数类型。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main() 
{char input[256]; // 假设输入字符串不会超过255个字符// 提示用户输入一个字符串printf("请输入一个数字字符串:");fgets(input, sizeof(input), stdin); // 使用fgets读取一行输入input[strcspn(input, "\n")] = 0; // 去除末尾的换行符// 使用atoi转换字符串为intint intValue = atoi(input);printf("atoi转换结果为int类型:%d\n", intValue);// 使用atol转换字符串为longlong longValue = atol(input);printf("atol转换结果为long类型:%ld\n", longValue);// 使用atoll转换字符串为long longlong long longLongValue = atoll(input);printf("atoll转换结果为long long类型:%lld\n", longLongValue);// 使用strtol转换字符串为long,并可以获取剩余字符串char *endPtr;long strtolValue = strtol(input, &endPtr, 10); // 假设输入为十进制printf("strtol转换结果为long类型:%ld\n", strtolValue);// 使用strtoll转换字符串为long longlong long strtollValue = strtoll(input, &endPtr, 10); // 假设输入为十进制printf("strtoll转换结果为long long类型:%lld\n", strtollValue);// 使用strtoul转换字符串为unsigned longunsigned long strtoulValue = strtoul(input, &endPtr, 10); // 假设输入为十进制printf("strtoul转换结果为unsigned long类型:%lu\n", strtoulValue);// 使用strtoull转换字符串为unsigned long longunsigned long long strtoullValue = strtoull(input, &endPtr, 10); // 假设输入为十进制printf("strtoull转换结果为unsigned long long类型:%llu\n", strtoullValue);return 0;
}

运行结果如下: 

2  字符串转浮点型数据

2.1 函数介绍

atof()strtod()strtof()strtold() 是C语言标准库中用于将字符串转换为浮点数的函数。下面是这些函数的原型、作用、参数说明以及一个示例程序:

atof() 函数:将字符串转换为双精度浮点数 (double)。

strtod() 函数:将字符串转换为双精度浮点数 (double),可以获取剩余字符串。

strtof() 函数:将字符串转换为单精度浮点数 (float),可以获取剩余字符串。

strtold() 函数:将字符串转换为长双精度浮点数 (long double),可以获取剩余字符串。

函数原型如下:

double atof(const char *str);
double strtod(const char *str, char **endptr);
float strtof(const char *str, char **endptr);
long double strtold(const char *str, char **endptr);
  • str:指向待转换的以字符串形式表示的浮点数的字符数组。
  • endptr:如果非空指针,函数在这里存储一个指向第一个无法进行转换的字符的指针。

2.2 示例程序

程序提示用户输入一个数字字符串,接着使用 atof()strtod()strtof()strtold() 函数将字符串转换为不同的浮点数类型,并打印出转换后的值。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main() 
{char input[256]; // 用于存储用户输入的字符串// 提示用户输入字符串printf("请输入一个数字字符串:");fgets(input, sizeof(input), stdin);input[strcspn(input, "\n")] = 0; // 去除字符串末尾的换行符// 使用atof转换字符串,并打印结果double atofValue = atof(input);printf("atof转换结果:%f (double类型)\n", atofValue);// 使用strtod转换字符串,并打印结果及可能的剩余字符串char *endPtr;double strtodValue = strtod(input, &endPtr);printf("strtod转换结果:%f ,剩余字符串:%s\n", strtodValue, endPtr ? endPtr : "");// 使用strtof转换字符串,并打印结果及可能的剩余字符串float strtofValue = strtof(input, &endPtr);printf("strtof转换结果:%f ,剩余字符串:%s\n", strtofValue, endPtr ? endPtr : "");// 使用strtold转换字符串,并打印结果及可能的剩余字符串long double strtoldValue = strtold(input, &endPtr);printf("strtold转换结果:%Lf ,剩余字符串:%s\n", strtoldValue, endPtr ? endPtr : "");return 0;
}

运行结果如下: 

3 数字转字符串

3.1 函数介绍

sprintf()snprintf() 是C语言中用于格式化输出到字符串的函数。sprintf() 函数将格式化的数据写入到一个字符串中,而 snprintf() 函数提供了一种更安全的方式来执行相同的任务,因为它允许你指定最大写入的字符数,从而避免缓冲区溢出。

函数说明:

  • sprintf() 函数:根据指定的格式将数据写入到字符串中。
  • snprintf() 函数:类似于 sprintf(),但限制了写入的最大字符数。

函数原型:

int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);
  • str:指向用于存储输出的字符串的指针。
  • format:格式字符串,定义了后续参数如何格式化。

3.2 函数原型

示例程序使用 sprintf()snprintf() 函数将用户通过键盘输入的数字格式化为字符串,程序首先提示用户输入一个数字和一个希望的输出字符串的最大长度。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX_BUFFER_SIZE 100int main() 
{char buffer[MAX_BUFFER_SIZE]; // 存储格式化后的字符串double num; // 用户输入的数字,这里使用double以支持小数size_t size; // 用户希望的输出size(包括空字符终止符)// 提示用户输入一个数字printf("请输入一个数字(可以是整数或小数):");scanf("%lf", &num); // %lf用于读取double类型的数字// 清除缓冲区中的残留输入while (getchar() != '\n') continue;// 提示用户输入希望的输出sizeprintf("请输入希望的输出字符串的最大长度:");scanf("%zu", &size);// 检查size是否超出了buffer的最大大小size = size > MAX_BUFFER_SIZE ? MAX_BUFFER_SIZE : size;// 使用sprintf将数字格式化为字符串sprintf(buffer, "%.2f", num); // %.2f表示格式化为小数点后两位printf("使用sprintf格式化的字符串: %s\n", buffer);// 清空buffer以便重新使用memset(buffer, 0, sizeof(buffer));// 使用snprintf将数字格式化为字符串,指定最大输出sizesnprintf(buffer, size, "%.2f", num);printf("使用snprintf格式化的字符串: %s\n", buffer);return 0;
}

程序运行结果如下: 

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

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

相关文章

连环计 | 第6集 | 百姓有倒悬之危,君臣有累卵之急 | 貂蝉 | 三国演义 | 逐鹿群雄

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 &#x1f4cc;这篇博客分享的是《三国演义》文学剧本第Ⅰ部分《群雄逐鹿》的第6️⃣集《连环计》的经典语句和文学剧本全集台词 文章目录 1.经典语句2.文学剧本台词 …

LabVIEW材料样本结构缺陷检测

本文介绍了一种基于LabVIEW的实验室振动特性分析测试装置&#xff0c;通过分析振动特性来检测结构缺陷。文章详细描述了具体案例、硬件型号、工作原理、软件功能以及注意事项。 硬件型号 振动传感器&#xff1a;PCB Piezotronics 352C33加速度计 数据采集卡&#xff1a;NI PXI…

python(基础语法,pandas,numpy,正则表达式,数据预处理)

python学习推荐网址&#xff1a; 白月黑羽 一、语法基础 目标&#xff1a; • list、tuple、set、dict的基本用法 • 内置函数 len&#xff08;&#xff09;&#xff0c; eval&#xff08;&#xff09;&#xff0c;range&#xff08;&#xff09;&#xff0c;sort&#xff08;…

Linux自动化交互脚本expect开发

在日常开发任务中&#xff0c;运行shell脚本有时候会提示输入密码的操作&#xff0c;如何让脚本自动输入密码呢&#xff1f;这时使用expect帮我们输入&#xff0c;Expect是基于Tcl发展而来的&#xff0c;它不仅可以进行交互&#xff0c;还可以根据程序的提示模拟标准输入&#…

西安高校大学智能制造实验室数字孪生可视化系统平台建设项目验收

随着工业4.0时代的到来&#xff0c;智能制造成为推动制造业转型升级的关键。为了培养学生的创新能力和实践能力&#xff0c;西安高校大学决定建设智能制造实验室&#xff0c;并引入数字孪生技术&#xff0c;构建可视化系统平台。项目旨在通过数字孪生技术&#xff0c;实现对制造…

YOLOv8训练参数总结及翻译

参数名称默认值描述modelNone指定用于训练的模型文件。接受 .pt 预训练模型或 .yaml 配置文件的路径。对于定义模型结构或初始化权重至关重要。dataNone数据集配置文件的路径(例如&#xff0c; coco8.yaml )。该文件包含特定于数据集的参数&#xff0c;包括到训练和验证数据的路…

微信小程序毕业设计-线上教育商城系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

线性表与顺序存储结构(上)

前言 线性表&#xff1a;零个或多个数据元素的有限序列。 线性表是数据结构中最常用和最简单的一种结构。 本文介绍的是线性表和线性表的顺序存储结构的部分内容。 正文 什么是线性表&#xff1f; 顾名思义&#xff0c;是具有像线一样的性质的表。 首先&#xff0c;它是一个…

刷代码随想录有感(120):贪心算法——买卖股票的最佳时机

题干&#xff1a; 代码&#xff1a; class Solution { public:int maxProfit(vector<int>& prices) {int low INT_MAX;int res INT_MIN;for(int i 0; i < prices.size(); i){low min(low, prices[i]);res max(res, prices[i] - low);}return res;} }; 贪心…

周末总结(2024/06/29)

工作 人际关系核心实践&#xff1a; 要学会随时回应别人的善意&#xff0c;执行时间控制在5分钟以内 坚持每天早会打招呼 遇到接不住的话题时拉低自己&#xff0c;抬高别人(无阴阳气息) 朋友圈点赞控制在5min以内 工作上的要点 现状&#xff08;接受破烂现状&#xff0c;改变…

ARCGIS添加在线地图

地图服务地址&#xff1a;http://map.geoq.cn/ArcGIS/rest/services 具体方法&#xff1a; 结果展示&#xff1a;

T4打卡 学习笔记

所用环境 ● 语言环境&#xff1a;Python3.11 ● 编译器&#xff1a;jupyter notebook ● 深度学习框架&#xff1a;TensorFlow2.16.1 ● 显卡&#xff08;GPU&#xff09;&#xff1a;NVIDIA GeForce RTX 2070 设置GPU from tensorflow import keras from tensorflow.keras…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的字符串拼接游戏(200分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

Spring Boot中的分布式文件系统

Spring Boot中的分布式文件系统 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我们将探讨如何在Spring Boot中实现分布式文件系统的搭建和应用…

GO sync包——读写锁

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

单例模式在 Android中的应用

单例模式在Android开发中的应用非常广泛&#xff0c;它确保了一个类在应用中只有一个实例&#xff0c;并提供了一个全局访问点。以下是对单例模式在Android中应用的深入讲解&#xff1a; 一、应用场景 全局资源管理&#xff1a; 在Android应用中&#xff0c;经常需要管理全局…

多表查询实训

前提 本篇博客&#xff0c;我将通过讲解例题的方式&#xff0c;带大家进一步掌握多表查询的使用规则和使用技巧 正文 前提 先建好表 表1 salgrade (薪资等级表&#xff09; 表2 emp(员工信息表&#xff09; 表3 dept&#xff08;部门信息表&#xff09;&#xff0c;插入相…

拉普拉斯变换(Laplace Transform)

拉普拉斯变换概述 拉普拉斯变换&#xff08;Laplace Transform&#xff09;是一种积分变换&#xff0c;用于将时间域&#xff08;通常是连续时间&#xff09;的信号转换到复频域&#xff0c;以便简化对系统的分析和设计。它在控制系统、信号处理、电路分析等领域广泛应用。 拉…

docker-mysql主从复制

MySQL主从复制 安装docker和拉取镜像不再赘述 一.主服务器 1.新建主服务器容器-3307 &#xff08;这里设置的密码可能不生效&#xff0c;若未生效请看问题中的2&#xff09; docker run -p 3307:3306 --name mysql-master \ -v /mydata/mysql-master/log:/var/log/mysql \…

老年生活照护实训室:探索现代养老服务的奥秘

在老龄化社会加速发展的今天&#xff0c;如何为老年人提供优质、贴心的生活照护服务&#xff0c;成为了社会关注的焦点。老年生活照护实训室作为培养专业养老服务人才的重要场所&#xff0c;正逐渐揭开现代养老服务的神秘面纱&#xff0c;为我们展现出一幅充满关爱与智慧的画卷…