C++:字符串string转成整型int

news/2024/9/18 20:36:51 标签: c++, 开发语言

一、atoi

atoi 是 C 标准库中的一个函数,全称是 ASCII to Integer,用于将字符串转换为整数。

函数定义

int atoi(const char *str);
  • 参数str 是一个指向以 '\0' 结尾的字符串的指针。
  • 返回值:返回字符串转换后的整数。如果字符串中不包含有效的数字,返回 0。

工作原理

atoi 从字符串的开头部分开始,逐字符地读取,忽略前导空格,然后将连续的数字字符转换为对应的整数值。当遇到第一个非数字字符时,转换停止。

  • 合法输入atoi 只处理合法的数字字符,数字前可以带一个可选的正负号 (+-)。
  • 错误处理:如果字符串中没有有效的数字,atoi 返回 0。此外,它没有提供错误检测机制,也无法检测数字溢出(即超过 int 类型的范围)。

示例

#include <stdio.h>
#include <stdlib.h>

int main() {
    const char *str1 = "123";
    const char *str2 = "   -456";
    const char *str3 = "abc123";
    const char *str4 = "789abc";
    
    printf("String: %s, Integer: %d\n", str1, atoi(str1));  // 输出: 123
    printf("String: %s, Integer: %d\n", str2, atoi(str2));  // 输出: -456
    printf("String: %s, Integer: %d\n", str3, atoi(str3));  // 输出: 0 (无效数字)
    printf("String: %s, Integer: %d\n", str4, atoi(str4));  // 输出: 789 (数字到非数字处停止)
    
    return 0;
}

输出:

String: 123, Integer: 123
String:    -456, Integer: -456
String: abc123, Integer: 0
String: 789abc, Integer: 789

注意

  • atoi 不处理错误情况,如果输入字符串无效或转换过程中发生溢出,它不会提示错误。因此,推荐使用更安全的函数,例如 strtolsscanf
  • strtol 替代:相比于 atoistrtol 可以提供更好的错误处理功能,例如处理溢出和检测无效输入。

二、strtol

strtol 是 C/C++ 标准库中的一个函数,用于将字符串转换为长整型数(long int),同时能够处理不同的数制(如二进制、八进制、十进制、十六进制)并检测转换错误。

函数定义

long int strtol(const char *str, char **endptr, int base);

参数

  1. str:指向一个以 '\0' 结尾的 C 字符串,这个字符串将被转换为长整型数。
  2. endptr:指向一个字符指针的地址。该指针将被设置为指向 str 中第一个未能转换为数值的字符。如果你不关心这个信息,可以传 NULL
  3. base:表示使用的进制。常见值:
    • 10:十进制
    • 8:八进制
    • 16:十六进制
    • 0:自动检测进制(如 0x 开头表示十六进制,0 开头表示八进制,其余默认为十进制)

返回值

  • 成功时:返回转换后的 long int 数值。
  • 失败时:如果字符串中没有有效的数字部分,返回 0;如果数值超出 long 的范围,返回 LONG_MAXLONG_MIN,并设置 errnoERANGE

工作原理

strtol 先跳过字符串开头的空白符(如空格、换行符等),然后尝试将字符串中的字符转换为 long 型数值,直到遇到一个非数字字符为止。

示例

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h>

int main() {
    const char *str = "123abc";
    char *endptr;
    long value;

    errno = 0;  // 清除 errno 以捕捉任何潜在错误
    value = strtol(str, &endptr, 10);  // 将字符串转换为 long 类型的十进制数

    // 检查转换后的结果
    if (errno == ERANGE) {
        // 处理范围错误,超出 LONG_MAX 或 LONG_MIN
        printf("Error: number out of range.\n");
    } else if (endptr == str) {
        // 没有任何字符被转换
        printf("No digits were found.\n");
    } else {
        // 成功转换了部分字符串
        printf("Converted value: %ld\n", value);
        printf("Non-converted part: %s\n", endptr);
    }

    return 0;
}

输出:

Converted value: 123
Non-converted part: abc

详细解释

  • endptr:指向未转换部分的第一个字符。在本例中,转换的是 "123",转换停止时 endptr 指向 "abc"
  • 错误处理
    • 如果转换后的数值超出了 long 的范围,strtol 将返回 LONG_MAXLONG_MIN,并将 errno 设置为 ERANGE
    • 如果字符串中没有可以转换的数字字符,strtol 返回 0,并将 endptr 设置为 str

使用 base 参数

strtol 可以转换不同进制的字符串。base 参数控制如何解释字符串中的数字:

  • 十六进制base = 16
long value = strtol("0xFF", NULL, 16);  // 转换为 255
  • 八进制base = 8

long value = strtol("077", NULL, 8);    // 转换为 63
  • 二进制base = 2

long value = strtol("101", NULL, 2);    // 转换为 5
  • 自动检测进制base = 0

    • 自动检测字符串的进制:如果字符串以 "0x" 开头,表示十六进制;以 "0" 开头,表示八进制;否则为十进制。
long value1 = strtol("0xFF", NULL, 0);  // 自动识别为 16 进制,转换为 255
long value2 = strtol("077", NULL, 0);   // 自动识别为 8 进制,转换为 63
long value3 = strtol("123", NULL, 0);   // 自动识别为 10 进制,转换为 123

错误处理

  • 检查转换结果:使用 errno 来检查溢出错误,例如,当转换值超出 long 类型的范围时,errno 会被设置为 ERANGE
  • 检查没有转换的情况:如果没有任何字符被转换,endptr 会指向原始字符串的开头,这时应当处理这种情况。

适用场景

  • 配置文件解析:将字符串转换为数字参数,例如程序启动时读取配置文件。
  • 用户输入处理:处理用户输入的数值并转换为整数。
  • 解析不同进制的数字:可以灵活处理二进制、八进制、十进制、十六进制的数字输入。

相比于 atoistrtol 更加灵活和安全,特别是在处理错误和支持不同进制方面。


http://www.niftyadmin.cn/n/5664485.html

相关文章

Flutter Android Package调用python

操作步骤 一、创建一个Flutter Package 使用以下指令创建一个Flutter Package flutter create --templateplugin --platformsandroid,ios -a java flutter_package_python 二、修改android/build.gradle文件 在buildscript——>dependencies中添加以下内容 //导入Chaqu…

【2024】前端学习笔记7-颜色-位置-字体设置

学习笔记 1.定义&#xff1a;css2.颜色&#xff1a;color3.字体相关属性&#xff1a;font3.1.字体大小&#xff1a;font-size3.2.字体风格&#xff1a;font - style3.3.字体粗细&#xff1a;font - weight3.4.字体族&#xff1a;font - family 4.位置&#xff1a;text-align 1.…

如何看待IBM中国研发部裁员?

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; IBM中国研发部裁员及撤出背景分析 IBM&#xff08;International Business Machines&#xff09;作为全球科技巨头之一&#xff0c;其在中国市场的发展曾是中国信息技术产业的重要组成部分。近年来&#x…

图片转PDF技巧揭秘:四款高效工具推荐!

在数字化办公和学习的今天&#xff0c;将图片或其他文件格式转换为PDF已成为一种常见需求。以下是几款推荐的转换工具&#xff0c;它们各自具有独特的功能和使用体验&#xff0c;可帮助大家轻松实现图片转PDF及其他PDF相关操作。 福昕PDF转换大师&#xff08;365客户端&#x…

Yestar成都艺星引领行业星纪元:十大数字星品·高阶星技术震撼发布

近日&#xff0c;中国成都太古里Yestar十大数字星品高阶星技术AI科技3D Mapping全球发布会&#xff0c;震撼发布了十大数字星品高阶星技术升级&#xff0c;引领医美产业发展翻开崭新的一页。作为品牌成立19周年的庆典&#xff0c;这场科技与美学交融的盛会&#xff0c;标志着医…

AI绘画Stable Diffusion 自制素材工具: layerdiffusion插件—你的透明背景图片生成工具

大家好&#xff0c;我是灵魂画师向阳 今天给大家分享一款AI绘画的神级插件—LayerDiffusion。 Layerdiffusion是一个用于stable-diffusion-webui 的透明背景生成&#xff08;不是生成图再工具扣图&#xff0c;是直接生成透明背景透明图像&#xff09;插件扩展&#xff0c;它可…

战神诸神黄昏9月19日登录PC端! 手机怎么玩战神诸神黄昏

9月19日&#xff0c;《战神&#xff1a;诸神黄昏》正式登录PC端&#xff0c;这是一部动作冒险游戏。要是你想随时随地在手机或平板上也能玩《战神&#xff1a;诸神黄昏》&#xff0c;可以使用网易GameViewer远程帮你实现。 网易GameViewer远程作为一款专为游戏玩家打造的远程软…

Java 读取特定目录下子文件夹的 json格式文件并解析

一、需求   有一个目录结构&#xff0c;包含多个子文件夹&#xff0c;每个子文件夹中都有一个名为goods.txt的文件&#xff0c;文件内容以 JSON 格式存储。现在需要将所有的goods.txt文件内容读取出来&#xff0c;放在一个List集合中&#xff0c;以便进行后续的处理。 二、使…