嵌入式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转换字符串为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;
}

程序运行结果如下: 

  • 23
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

几度春风里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值