首先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; }
输出结果为:spa
atoi的结果为:232
strtol的结果为:232code
能够看到,程序在最开始遇到空格跳过,而后遇到了字符's'终止,最后返回了232。blog
这里要补充的是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;
输出结果为:string
atoi的结果为:0 strtol的结果为:233495534
另外能够注意到的是,若是转换失败,这两个函数不会报错,而是返回0。class
可是对于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注释掉再看:call
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
因此在使用时,须要根据实际状况来选择。