C语言中strtod与strtol的区别
strtod与strtol都是C/C++中常用的将字符数组转换成数组型常用的函数,但是它们也有一定的区别(C++真是让人又爱又恨)。
strtod用法
定义:double strtod (const char* nptr, char** endptr);
参数:nptr为待转换的字符数组,endptr为不符合条件而终止nptr中的字符指针;
strtol用法
定义:long strtol (const char* nptr, char** endptr, int base);
参数:nptr为待转换的字符数组,endptr为不符合条件而终止nptr中的字符指针,base为转换的进制数。
strtod与strtol共同点
- 扫描nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始转换;
- 若endptr不为NULL,则会将不符合条件而终止的nptr中的字符指针由endptr传回;
- 当出现不符合要求的字符或字符串结束时('\0')才结束转换,并将结果返回;
- 处理的格式是char *,如果对象是string对象,则需要利用c_str()转换为字符数组格式。
strtod与strtol不同点
- 返回值不同:strtod返回double,并且四舍五入保留一位小数;strtol返回long;
- 要求不同:strtod的字符数组中可包含正负号,小数点或者E(e)表示指数部分;strtol只能包含数字和正负号;
- 数字进制不同:strtod只能转换为十进制;strtol可根据base选择不同的进制数。
实例讲解
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
char * endptr;
char a[] = " -12321.45";
char b[] = "234.23424sdfd";
char c[] = "-2343.23e4";
char d[] = "#v1";
string e = "12312.234";
cout << "---------------------strtod实例---------------------"<< endl;
cout << "a =" << strtod(a,NULL) << endl;
cout << "b =" << strtod(b,&endptr) << endl;
cout << "endptr =" << endptr << endl;
cout << "c =" << strtod(c,NULL) << endl;
cout << "d =" << strtod(d,&endptr) << endl;
cout << "endptr =" << endptr << endl;
cout << "e =" << strtod(e.c_str(),&endptr) << endl;
cout << "---------------------strtol实例---------------------"<< endl;
cout << "a =" << strtol(a,NULL,10) << endl;
cout << "b =" << strtol(b,&endptr,10) << endl;
cout << "endptr =" << endptr << endl;
cout << "c =" << strtol(c,NULL,10) << endl;
cout << "d =" << strtol(d,&endptr,10) << endl;
cout << "endptr =" << endptr << endl;
cout << "e =" << strtod(e.c_str(),&endptr) << endl;
return 0;
}
运行结果如下: