atoi、stoi、strtoi区别

摘要:
必须调整c_str()方法将其转换为char*字符串。Intmain(){usingnamespacestd;stringstrnum=“232s3112”;usingnamespace std;intnum1=atoi(strnum.cstr());longingtnum2=strtol(strnum_cstr)),“strtol的结果是:Intmain(){usingnamepacestd;

首先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,10);
    cout<<"atoi的结果为:"<<num1<<endl;
    cout<<"strtol的结果为:"<<num2<<endl;
    return 0;
}

输出结果为:

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,16);
    cout<<"atoi的结果为:"<<num1<<endl;
    cout<<"strtol的结果为:"<<num2<<endl;
    return 0;

输出结果为:

atoi的结果为:0
strtol的结果为:233495534

另外可以注意到的是,如果转换失败,这两个函数不会报错,而是返回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 0;
}

程序会报错:

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 0;
}

其结果为:

atoi的结果为:0

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

免责声明:文章转载自《atoi、stoi、strtoi区别》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[转]浮点运算decimal.jsjava架构-一些设计上的基本常识下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

阿花宝宝 Java 笔记 之 初识java

1.记事本开发一个Java程序  编写源程序   源程序以.java为后缀名  编译     javac  编译后生成的文件以.class为后缀名  运行     java 运行编译后生成的.class文件2.java程序框架public class Hello{ public static void main(String[] args){  //注释  ...

[Swift]遍历字符串

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen/LeetCode➤原文地址:https://...

JavaSE之Long 详解 Long的方法简介以及用法

基本功能 Long 类在对象中包装了基本类型 long 的值 每个 Long 类型的对象都包含一个 long 类型的字段 static long MAX_VALUE long 8个字节最大值2^63-1十六进制:  0x8000000000000000L static long MIN_VALUE 最小值-2^63十六进制...

java python AES 加密 对比

/** * aes解密 * @param * @param content 密文 * @return */ public static String AESDncode(String appkey, String content) { try { // 1....

C#中析构函数,命名空间及字符串的运用(Ninth day)

又到了总结知识的时间了,今天在云和学院学习了析构函数,命名空间及字符串的处理,现在就为大家总结下来。 理论: 析构函数 不能在结构中定义析构函数。只能对类使用析构函数。 一个类只能有一个析构函数。 无法继承或重载析构函数。 无法调用析构函数。它们是被自动调用的。 析构函数既没有修饰符,也没有参数。 命名空间 •namespace(命名空间),用于解决类重...

struts2实现简单文件下载功能

Struts2提供了stream结果类型,该结果类型是专门用于支持文件下载功能的。配置stream类型的结果需要指定以下4个属性。  contentType:指定被下载文件的文件类型  inputName:指定被下载文件的入口输入流  contentDisposition:指定下载的文件名  bufferSize:指定下载文件时的缓冲大小 stru...