首先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
所以在使用时,需要根据实际情况来选择。