首页 > 编程语言 >C++(stoi())

C++(stoi())

时间:2024-08-23 10:41:10浏览次数:9  
标签:std string int pos C++ stoi 字符串

目录



std::stoi() 是 C++11 引入的一个标准库函数,用于将字符串转换为整数。与 atoi() 不同,stoi() 提供了更强的功能,包括错误处理、支持指定进制等。

1. 函数

int stoi(const std::string& str, std::size_t* pos = nullptr, int base = 10);

1.1 参数

  • str:一个 std::string 或 C 风格字符串 (const std::string&),表示待转换的数字字符串。
  • pos:可选参数,是一个指向 size_t 类型的指针,用于存储字符串中第一个无法转换的字符的索引位置。如果转换成功,pos 会指向该字符的索引。如果不需要这个功能,可以将其设为 nullptr(默认值)。
  • base:可选参数,指定要转换的进制,默认值为 10(即十进制)。stoi 支持 2 到 36 的进制。

1.2 返回值

  • 返回字符串中表示的整数值。
  • 如果字符串中的数字超出了 int 类型的范围,stoi 会抛出 std::out_of_range 异常。

1.3 异常

std::stoi 提供了异常处理机制:

  • std::invalid_argument:如果输入的字符串不包含可转换的数字。
  • std::out_of_range:如果字符串中表示的数字超出了 int 类型的表示范围。


2. 示例

#include <iostream>
#include <string>  // 包含 std::stoi
#include <stdexcept>  // 包含异常类

int main() {
    try {
        std::string str1 = "1234";
        std::string str2 = "56abc";
        std::string str3 = "abc123";
        std::string str4 = "4294967296";  // 超出 int 范围
        
        int num1 = std::stoi(str1);  // 转换为整数 1234
        int num2 = std::stoi(str2);  // 转换为整数 56,遇到非数字字符后停止
        // int num3 = std::stoi(str3);  // 抛出 std::invalid_argument 异常
        // int num4 = std::stoi(str4);  // 抛出 std::out_of_range 异常
        
        std::cout << "num1: " << num1 << std::endl;
        std::cout << "num2: " << num2 << std::endl;
        
    } catch (const std::invalid_argument& e) {
        std::cerr << "Invalid argument: " << e.what() << std::endl;
    } catch (const std::out_of_range& e) {
        std::cerr << "Out of range: " << e.what() << std::endl;
    }
    
    return 0;
}

输出:

num1: 1234
num2: 56

2.1 使用 base 参数

std::stoibase 参数允许你转换不同进制的字符串。例如,你可以使用 base = 16 来转换十六进制数,或者 base = 2 来转换二进制数:

#include <iostream>
#include <string>

int main() {
    std::string hexStr = "1A";
    std::string binStr = "1101";
    
    int hexNum = std::stoi(hexStr, nullptr, 16);  // 十六进制转换
    int binNum = std::stoi(binStr, nullptr, 2);   // 二进制转换
    
    std::cout << "Hexadecimal 1A to decimal: " << hexNum << std::endl;
    std::cout << "Binary 1101 to decimal: " << binNum << std::endl;

    return 0;
}

输出:

Hexadecimal 1A to decimal: 26
Binary 1101 to decimal: 13

2.2 pos 参数的使用

pos 参数用于跟踪解析到字符串的哪一部分:

#include <iostream>
#include <string>

int main() {
    std::string str = "123abc456";
    size_t pos;
    int num = std::stoi(str, &pos);  // num 为 123,pos 为 3("abc456" 的位置)
    
    std::cout << "Number: " << num << ", Position: " << pos << std::endl;

    return 0;
}

输出:

Number: 123, Position: 3


3. 总结

  • std::stoi 是一个功能强大的字符串转换函数,支持多种进制、错误处理和字符串解析位置的跟踪。
  • 相比 atoi,它提供了更安全和灵活的方式来处理字符串转换,尤其是在需要处理复杂输入和错误时。


标签:std,string,int,pos,C++,stoi,字符串
From: https://www.cnblogs.com/keye/p/18375473

相关文章

  • C++(atoi())
    目录1.函数1.1参数1.2返回值1.3注意事项2.示例3.atoi的局限性4.推荐替代函数atoi()是C++标准库中的一个函数,用于将C风格字符串转换为整数。atoi是"ASCIItoInteger"的缩写,它可以将包含数字的字符串解析为整数值。1.函数intatoi(constchar*str);1.1参......
  • C++ 链表
    1.前言链表:不仅存储 当前元素的数据,还存储着 元素排列顺序2. 正题2.1如何存储节点?我们可以使用结构体 数组来存储 链表节点structNode{intval;//可以是string或其它复杂的类型intnxt;}node[N];Tip:下标顺序不是单链表顺序 val代表 元......
  • c++一些面试题目
    摘自:https://www.cnblogs.com/lidabo/p/3284921.html1、Whatisachievedbyprefixingthe'static'keywordtoafile-levelfunctionorfile-levelvariabledeclaration? 使用static关键字修饰文件级的函数和变量起到什么作用? key:对变量来说,不允许文件外的程序访问;对......
  • C++模板的细节改进
    emsp;emsp;C++11改进了编译器的解析规则,尽可能的将多个右尖括号(>)解析称模板参数结束符,方便我们编写模板相关的代码。1.模板的右尖括号emsp;emsp;在C++98/03的泛型编程中,模板实例化有一个很繁琐的地方,那就是连续两个右尖括号(>>)会被变异器解释称右移操作符,而不是模板参数表的结束......
  • 移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——6.vector(模拟实现)
    1.存储结构namespacezone{ template<classT>//需要模板 classvector { public:private: iterator_start; iterator_finish; iterator_endofstorage;};}可见,vector内核是由三个指针实现的2.默认成员函数 2.1.构造函数1.初始化列......
  • C++初学(14)
    14.1、while循环和for循环相比,while循环没有初始化和更新部分,它只有测试条件和循环体。while(text-condition)body首先程序计算圆括号内的测试条件(text-condition)表达式。如果该表达式为ture,则执行循环体中的语句。和for循环一样,循环体也由一条语句或两个花括号定义的......
  • CMake编译不同文件目录下的C++文件
        由于我们构建一个项目的时候,通常不会将所有的源文件放在一个文件目录下,这样既不方便开发,也不方便源码阅读,我们通常会对项目文件进行分层,比如分为include、src、res、lib这些目录,src下又分为model、controller、view这些目录。所以跨文件编译C++文件就相当必要了,如......
  • C++设计模式1:单例模式(懒汉模式和饿汉模式,以及多线程问题处理)
    饿汉单例模式        程序还没有主动获取实例对象,该对象就产生了,也就是程序刚开始运行,这个对象就已经初始化了。 classSingleton{public: ~Singleton() { std::cout<<"~Singleton()"<<std::endl; } staticSingleton*get_instance() { return&sin......
  • 【C/C++ 软件开发模拟面试 集】cmake 相关知识点模拟面试
    摘自:https://zhuanlan.zhihu.com/p/662623216第一轮:基础知识 1.1什么是CMake? 面试官: 请问你能简单描述一下CMake是什么,以及它通常用来做什么吗? 面试者: CMake是一个跨平台的自动化构建系统,主要用来管理软件构建的过程,它使用一个名为CMakeLists.txt的配置文件来指导编......
  • c++矩阵旋转问题
    问题有一个MxN的矩阵,设计函数将其顺时针旋转90度。打印示例Originalmatrix:123456789Rotatedmatrix(90degreesclockwise):741852963代码#include<iostream>#include<vector>usingnamespacestd;voidrotateMatrix90Clockwise(constv......