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

news2024/11/27 6:19:27

目录

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转换字符串为int
    int intValue = atoi(input);
    printf("atoi转换结果为int类型:%d\n", intValue);

    // 使用atol转换字符串为long
    long longValue = atol(input);
    printf("atol转换结果为long类型:%ld\n", longValue);

    // 使用atoll转换字符串为long long
    long 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 long
    long long strtollValue = strtoll(input, &endPtr, 10); // 假设输入为十进制
    printf("strtoll转换结果为long long类型:%lld\n", strtollValue);

    // 使用strtoul转换字符串为unsigned long
    unsigned long strtoulValue = strtoul(input, &endPtr, 10); // 假设输入为十进制
    printf("strtoul转换结果为unsigned long类型:%lu\n", strtoulValue);

    // 使用strtoull转换字符串为unsigned long long
    unsigned 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 100

int main() 
{
    char buffer[MAX_BUFFER_SIZE]; // 存储格式化后的字符串
    double num; // 用户输入的数字,这里使用double以支持小数
    size_t size; // 用户希望的输出size(包括空字符终止符)

    // 提示用户输入一个数字
    printf("请输入一个数字(可以是整数或小数):");
    scanf("%lf", &num); // %lf用于读取double类型的数字

    // 清除缓冲区中的残留输入
    while (getchar() != '\n') continue;

    // 提示用户输入希望的输出size
    printf("请输入希望的输出字符串的最大长度:");
    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将数字格式化为字符串,指定最大输出size
    snprintf(buffer, size, "%.2f", num);
    printf("使用snprintf格式化的字符串: %s\n", buffer);

    return 0;
}

程序运行结果如下: 

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

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

相关文章

倩女幽魂装备攻略:全面解读与获取指南!

《倩女幽魂》作为一款经典的网络游戏&#xff0c;以其丰富多彩的装备系统和多样的玩法吸引了大量玩家。本文将深入解析《倩女幽魂》中的装备系统&#xff0c;包括装备的颜色、类别、词缀以及获取途径&#xff0c;帮助玩家更好地理解和利用装备来提升自己的游戏体验。 首先下载专…

分享恒指交易的一些心得

1、 做恒指跟国内其它期货一样&#xff0c;可以使用的指标有很多&#xff0c;最重要看适不适合 2、恒指交易一般是短线交易&#xff0c;可以看1分钟线图或3分钟&#xff0c;时间周期越短&#xff0c;反应越快&#xff0c;灵敏度越高 3、做恒指期货操作的时候不要重仓&#xf…

C语言力扣刷题10——有效的括号——[栈]

力扣刷题10——有效的括号——[栈] 一、博客声明二、题目描述三、解题思路1、知识补充 a、什么是栈&#xff08;Stack&#xff09; 2、思路说明 四、解题代码&#xff08;附注释&#xff09; 一、博客声明 找工作逃不过刷题&#xff0c;为了更好的督促自己学习以及理解力扣大佬…

问题解决:python安装依赖时网络问题报错

进行 pip install 时&#xff0c;安装轮子访问过慢而造成安装失败&#xff0c;有时候配置镜像源仍会出现莫名其妙的问题&#xff0c;包括网络代理问题等。看了一些解决方案&#xff0c;找出了一个最适合的方式&#xff0c;如下所示&#xff1a; pip install -i https://pypi.t…

androidx.preference框架介绍

一,概要 Preference作为setting核心框架,笔者对此框架做一个简单的解析,androidx.preference本质是对设置领域提供了一层View封装,以android view本身的策略模式进行二次开发,将常用的一些设置样式封装到不同的Preference中,以达到快速开发设置相关功能。并且,此风格与…

labview排错

源代码正常跑&#xff0c;应用程序报这个错&#xff0c;是因为源代码的可以找到项目路径内所有dll的路径&#xff0c;而应用程序只能找到data文件夹的dll文件 解决查看源代码中.net的程序集的路径&#xff0c;复制对应的dll到data文件夹下 在执行developinterface.dll出现labv…

k8s架构设计思想

1.谷歌borg云计算管理平台 一类&#xff1a;infrastucture platform software 另一类&#xff1a;borg为主的非虚拟化技术&#xff0c;调度进程 核心是轻量级作业调度&#xff0c;不是做虚拟化/云平台的 borg本身用了一些容器技术 生产业务product workload要求高可用&#xf…

知名大客户销售讲师培训师专家顾问讲运营商政企客户银行公司金融客户销售AI数字B2B市场B2B销售技巧B2B销售策略大客户销售技巧人工智能高价值客户销售

最近在写一本新书AI时代的大客户销售个人如何转型&#xff1f;个人核心能力与方法论如何办&#xff1f; 传统的大客户销售、顾问式销售正在走向高原&#xff0c;销售人效比及效率到达边界&#xff0c;AI数字化销售正在扑面而来。 AI时代销售的未来&#xff1a;销售的必经之路 …

深度解读昇腾CANN计算图优化技术,提升算法计算效率

随着大模型时代的到来&#xff0c;AI算法的能力上限不断被刷新&#xff0c;算力门槛也在持续飙升&#xff0c;如何在有限的计算资源的条件下优化和训练模型显得尤其重要。面向计算图编译和运行优化场景&#xff0c;昇腾AI异构计算架构CANN&#xff08;Compute Architecture for…

餐饮点餐系统

餐饮点餐系统是一款为餐厅和顾客提供便捷点餐服务的在线平台。 1.DDL CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY COMMENT 用户ID,username VARCHAR(50) NOT NULL UNIQUE COMMENT 用户名,password VARCHAR(255) NOT NULL COMMENT 密码,email VARCHAR(100) UNIQUE…

http服务网络请求如何确保数据安全(含python示例源码)

深度学习类文章回顾 【YOLO深度学习系列】图像分类、物体检测、实例分割、物体追踪、姿态估计、定向边框检测演示系统【含源码】 【深度学习】物体检测/实例分割/物体追踪/姿态估计/定向边框/图像分类检测演示系统【含源码】 【深度学习】YOLOV8数据标注及模型训练方法整体流程…

命令行中关于windows hash md5 , mac hash md5 , linux hash md5 文件校验方式

md5&#xff0c; sha-1 &#xff0c;sha256. windows certutil -hashfile filename md5certutil -hashfile filename sha1certutil -hashfile filename sha256macos 平台 md5 filenameshasum -a 1 filenameshasum -a 256 filenamelinux 平台 md5sum filenameshasum -a 1 fil…

菜籽桌面4.5.0~4.5.1常见问题解答

目录 如何刷机&#xff1f; 刷机失败&#xff1f; 无法方控&#xff1f; 无法画中画? 原车音乐跟我安装的音乐一起播放&#xff1f; 原车音乐停了&#xff0c;我安装的软件也跟着没声音了&#xff1f; 调节声音时忽大忽小&#xff1f; 怎么安装软件&#xff1f; 软件…

spring boot (shiro)+ websocket测试连接不上的简单检测处理

1、用前端连接测试的demo一切正常&#xff0c;但是到了项目中连接不上了 一开始以为是地址错&#xff0c;但是换了apifox测试也是不可以。 2、考虑是shiro进行了拦截了&#xff0c;所以就访问不到了地址&#xff0c;那么就放行。 3、再次用apifox测试&#xff0c;成功了。 当然…

Halcon 如何让图像自适应窗口

一 如何让图像自适应窗口 read_image(Image,1)get_image_size(Image,Width, Height)dev_close_window()dev_open_window(0,0,Width/2,Height/2,black,WindowHandle)dev_set_part(0,0,Height-800,Width-800)dev_display(Image)二 如何实现彩色图像转化为灰色图像 read_image(I…

Java nio 的线程通信机制线程通信Pipe

Java的Pipe是一种新的线程通信机制&#xff0c;传统的线程通信可以是通过共享内存的方式&#xff0c;socket等方式&#xff0c;而Pipe是通过Java NIO 通信的方式实现共享内存&#xff0c;优点类似于go语言的管道 先上代码 public static void main(String[] args) throws IOEx…

国外的Claude3.5 Sonnet Artifacts和国内的CodeFlying孰强孰弱?

在Claude 3.5 Sonnet发布后&#xff0c;最受大家关注的问题应该就是它在编写代码能力上的变化。 要知道在Claude3.0发布以来的这几个月就因为它的编写代码能力而一直受到人们的诟病。 那Anthropic这次终于是不负众望&#xff0c;在Claude 3.5 Sonnet中更新了一个叫做Artifact…

.net core 的 winform 的 浏览器控件 WebView2

在.NET Core WinForms应用程序中&#xff0c;没有直接的“浏览器控件”&#xff0c;因为WinForms不支持像WebBrowser控件那样的功能。但是&#xff0c;你可以使用WebView2控件&#xff0c;它是一个基于Chromium的浏览器内核&#xff0c;可以在WinForms应用程序中嵌入Web内容。 …

用英文介绍芝加哥(1):Making Modern Chicago Part 1 Building a Boomtown

Making Modern Chicago | Part 1: Building a Boomtown Link: https://www.youtube.com/watch?vpNdX0Dm-J8Y&listPLmSQiOQJmbZ7TU39cyx7gizM9i8nOuZXy&index4 Summary Summary of Chicago’s History and Development Urban Planning and Growth Chicago, often r…

新手入门爬虫:从零开始,轻松掌握网络数据采集技术(有实战)

在互联网高速发展的今天&#xff0c;数据已经成为了各行各业的重要资源。而爬虫作为一种特殊的程序&#xff0c;可以帮助我们快速地获取到大量的数据。本文将从零开始&#xff0c;带领大家了解爬虫的基本概念、原理以及实践操作&#xff0c;帮助新手轻松掌握网络数据采集技术。…