首先atoi和strtol都是c里面的函数,他们都可以将字符串转为int,它们的参数都是const char*,因此在用string时,必须调c_str()方法将其转为char*的字符串。或者atof,strtod将字符串转为double,它们都从字符串开始寻找数字或者正负号或者小数点,然后遇到非法字符终止,不会报异常:

int main() {
using namespace std;
string strnum=" 232s3112";
int num1=atoi(strnum.c_str());
long int num2=strtol(strnum.c_str(),nullptr,);
cout<<"atoi的结果为:"<<num1<<endl;
cout<<"strtol的结果为:"<<num2<<endl;
return ;
}

输出结果为:

atoi的结果为:232
strtol的结果为:232

可以看到,程序在最开始遇到空格跳过,然后遇到了字符's'终止,最后返回了232。

这里要补充的是strtol的第三个参数base的含义是当前字符串中的数字是什么进制,而atoi则只能识别十进制的。例如:

    using namespace std;
string strnum="0XDEADbeE";
int num1=atoi(strnum.c_str());
long int num2=strtol(strnum.c_str(),nullptr,);
cout<<"atoi的结果为:"<<num1<<endl;
cout<<"strtol的结果为:"<<num2<<endl;
return ;

输出结果为:

atoi的结果为:
strtol的结果为:

另外可以注意到的是,如果转换失败,这两个函数不会报错,而是返回0。

但是对于stoi就不是这样了,atoi是string库中的函数,他的参数是string。

int main() {
using namespace std;
string strnum="XDEADbeE";
int num1=atoi(strnum.c_str());
int num2=stoi(strnum);
cout<<"atoi的结果为:"<<num1<<endl;
cout<<"stoi的结果为:"<<num2<<endl;
return ;
}

程序会报错:

terminate called after throwing an instance of 'std::invalid_argument'
what(): stoi

我们把stoi注释掉再看:

int main() {
using namespace std;
string strnum="XDEADbeE";
int num1=atoi(strnum.c_str());
//int num2=stoi(strnum);
cout<<"atoi的结果为:"<<num1<<endl;
//cout<<"stoi的结果为:"<<num2<<endl;
return ;
}

其结果为:

atoi的结果为:

所以在使用时,需要根据实际情况来选择。

atoi、stoi、strtoi区别的更多相关文章

  1. c++的atoi和stoi一些区别

    c++的atoi和stoi一些区别 对c++标准库中字符串转化为int的两个函数atoi()和stoi()两个有所混乱,特地研究了一下. stoi() 标准库的函数默认模板 int stoi (con ...

  2. LeetCode297. Serialize and Deserialize Binary Tree

    题目 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据. 请设计一个算法来实 ...

  3. C/C++中字符串和数字互转小结

    一. 数字 转 char*型 1.sprintf函数(适合C和C++) 示例: char str[50]; int num = 345; sprintf(str,"%d",num) ...

  4. 【持续更新】【pat】pat刷题技巧记录

    修改code completion快捷键位CTRL+ENTER,帮助提示函数名称 修改命令行提示符的属性,开启快速编辑模式,方便调试 添加c++11语言标准支持 开启代码调试功能 对输入的字符串进行切 ...

  5. c语言字符处理函数常见使用集合

    1.最近看一些开源项目代码时,总会看到 c 语言中一些  "str" 开头的处理字符串的用法,有的之前没用到过,特此记录,随时看到随时添加. 这里不提出源码,只是一些使用说明加例子 ...

  6. 【C++】atoi与stoi

    stoi函数默认要求输入的参数字符串是符合int范围的[-2147483648, 2147483647],否则会runtime error.atoi函数则不做范围检查,若超过int范围,则显示-214 ...

  7. atoi和stoi

    vs环境下:stoi函数默认要求输入的参数字符串是符合int范围的[-2147483648, 2147483647],否则会runtime error.atoi函数则不做范围检查,若超过int范围,则 ...

  8. atoi()和stoi()函数

    C++的字符处理函数,把数字字符串转换成int输出 头文件都是#include<cstring> atoi()的参数是 const char* ,因此对于一个字符串str我们必须调用 c_ ...

  9. Loadrunner中web_find和web_reg_find函数的使用与区别

    总结一下Loadrunner中的检查点函数,主要介绍两个函数:web_find()和web_reg_find():这两个函数均用于内容的查找,但两者也有本质的区别,具体介绍如下:一.web_find( ...

随机推荐

  1. iOS:实现表格填充和选择操作

    功能:创建一个列表,用数组填充表格,并支持选择列表行 // // main.m // Hello // // Created by lishujun on 14-8-28. // Copyright ...

  2. IOSアプリケーション開発環境の構築

    IOSアプリケーション開発環境の要求 1) IOSシステムの構造はそのようになっています: 2) ハードウエアの方の要求: コンピューター a)    デュアルコアCPU b)    8 gメモリ(開 ...

  3. [BZOJ 2440] [中山市选2011] 完全平方数 【二分 + 莫比乌斯函数】

    题目链接:BZOJ - 2440 题目分析 首先,通过打表之类的方法可以知道,答案不会超过 2 * k . 那么我们使用二分,对于一个二分的值 x ,求出 [1, x] 之间的可以送出的数有多少个. ...

  4. Google提议使用Jsonnet来增强JSON

    Google开源了一门配置语言Jsonnet来取代JSON,它完全向后兼容并加入了一些新特性:注释.引用.算术运算.条件操作符,数组和对象内含,引入,函数,局部变量,继承等.Jsonnet程序被翻译为 ...

  5. 【uva11374】Airport Express 最短路

    题意: 在Iokh市中,机场快线是市民从市内去机场的首选交通工具.机场快线分为经济线和商业线两种,线路,速度和价钱都不同.你有一张商业线车票,可以坐一站商业线,而其他时候只能乘坐经济线.假设换乘时间忽 ...

  6. Java接口修饰符详解

    接口就是提供一种统一的”协议”,而接口中的属性也属于“协议”中的成员.它们是公共的,静态的,最终的常量.相当于全局常量.抽象类是不“完全”的类,相当于是接口和具体类的一个中间层.即满足接口的抽象,也满 ...

  7. PuTTY DSA签名远程缓冲区溢出漏洞(CVE-2013-4207)

    漏洞版本: Simon Tatham PuTTY 0.52 - 0.63 漏洞描述: BUGTRAQ ID: 61649 CVE(CAN) ID: CVE-2013-4207 PuTTY是Window ...

  8. 查看Mysql执行计划

    使用navicat查看mysql执行计划: 打开profile分析工具: 查看是否生效:show variable like ‘%profil%’; 查看进程:show processlist; 选择 ...

  9. 根据SimpleScheduleBuilder配置不同的SimpleTrigger触发器

    Job代码: [java] view plaincopy package cn.zto.job;  import java.text.SimpleDateFormat;  import java.ut ...

  10. [JIT_APP]Android SQLite简介

    SQLite介绍 SQLite是一个非常流行的嵌入式数据库,它支持SQL语言,并且只利用很少的内存就有很好的性能.此外它还是开源的,任何人都可以使用它.许多开源项目(Mozilla, PHP, Pyt ...