首先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的结果为:
所以在使用时,需要根据实际情况来选择。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)