c语言stdlib库函数小结
- 前言:因为刷题的时候经常遇到字符串转化为数字的问题,而c语言标准库中的stdlib库函数可以有效地解决这个问题。所以今天做个小结。因为c++是向下兼容c语言的,支持所有的c头文件,但是为了符合c++标准,所以c头文件都有一个c++版本的,去掉.h后缀,并在名字前加c。如这里<stdlib.h>要变成<cstdlib>。
- stdlib库函数
(1)atof函数:
描述:double atof(const char *str)——把参数 str 所指向的字符串转换为一个浮点数(类型为 double 型)。函数返回转换后的双精度浮点数,如果没有执行有效的转换,则返回零(0.0)。
代码:
#include<cstdio>
#include<cstdlib>
int main(){
double f,f1;
char ch[10]="1234.456";
char ch1[10]="hello";
f=atof(ch);
f1=atof(ch1);
printf("字符串=%s,浮点数值=%lf\n",ch,f);
printf("字符串=%s,浮点数值=%lf",ch1,f1);
return 0;
}
结果:
注意:这里有一点值得注意,atof函数参数要求传入字符型的指针变量,代表字符数组(因为c语言是没有原生的字符串类型的,一般都是用字符数组来代替)。数组名是指向数组首元素的地址,即数组名ch=&ch[0],所以f=atof(ch)可以写成f=atof(&ch[0])。
(2)atoi函数:
描述:int atoi(const char *str)——把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。函数返回转换后的整型值,如果没有执行有效的转换,则返回零(0)。
代码:
#include<cstdio>
#include<cstdlib>
int main(){
int i,i1;
char ch[10]="1234.456";
char ch1[10]="hello";
i=atoi(&ch[0]);
i1=atoi(&ch1[0]);
printf("字符串=%s,整型值=%d\n",ch,i);
printf("字符串=%s,整型值=%d",ch1,i1);
return 0;
}
结果:
(3)atol函数:(同上)
描述:long int atol(const char *str)——把参数 str 所指向的字符串转换为一个长整数(类型为 long int 型)。 不做过多赘述。
(4)strtod函数:
描述:double strtod(const char *str, char **endptr)——把参数 str 所指向的字符串转换为一个浮点数(类型为 double 型)。如果 endptr 不为空,则指向转换中最后一个字符后的字符的指针会存储在 endptr 引用的位置。该函数返回转换后的双精度浮点数,如果没有执行有效的转换,则返回零(0.0)。说得很拗口,看个例子就知道了。
代码:
#include<cstdio>
#include<cstdlib>
int main(){
double f,f1,f2,f3;
char ch[30]="1234.456 hello world!";
char ch1[20]="hello world! ";
char ch2[20]="hello world! 123";
char ch3[20]="123456";
char *ptr;
char *ptr1;
char *ptr2;
char *ptr3;
f=strtod(ch,&ptr);
f1=strtod(ch1,&ptr1);
f2=strtod(ch2,&ptr2);
f3=strtod(ch3,&ptr3);
//f3=strtod(ch3,NULL);
printf("字符串=%s,浮点数值=%lf\n",ch,f);
printf("字符串=%s,浮点数值=%lf\n",ch1,f1);
printf("字符串=%s,浮点数值=%lf\n",ch2,f2);
printf("字符串=%s,浮点数值=%lf\n",ch3,f3);
printf("%s\n",ptr);
printf("%s\n",ptr1);
printf("%s\n",ptr2);
printf("%s\n",ptr3);
return 0;
}
结果:
注:其实字符串endptr指向所表示的浮点型数之后的部分,如果字符串全是浮点型数,那endptr所表示的字符串为null,也没有必要去定义字符指针去指向浮点数后面的位置,f3=strtod(ch3,NULL)这样调用函数即可。
(5)strtol函数:
描述:long int strtol(const char *str, char **endptr, int base)——把参数 str 所指向的字符串转换为一个长整数(类型为 long int 型)。参数 str 所指向的字符串根据给定的 base 转换为一个长整数(类型为 long int 型),base 必须介于 2 和 36(包含)之间,或者是特殊值 0。endptr 是对类型为 char* 的对象的引用,其值由函数设置为 str 中数值后的下一个字符。该函数返回转换后的长整数,如果没有执行有效的转换,则返回一个零值。
代码:
#include<cstdio>
#include<cstdlib>
int main(){
int i,i1;
char *ptr;
char *ptr1;
char ch[30]="123456 hello world!";
i=strtol(ch,&ptr,10);
i1=strtol(ch,&ptr1,2);
printf("字符串=%s,长整型值=%d\n",ch,i);
printf("字符串=%s,长整型值=%d\n",ch,i1);
printf("%s\n",ptr);
printf("%s\n",ptr1);
return 0;
}
结果:实际上,基数就是进制,参数base代表采用的进制方式,base=0和base=10结果相同。但是假如base=2,也就是默认是二进制,二进制的世界只有0和1,则1后面的23456识别不了,认为和后面的hello world!都是除长整型数之外的字符串。如下: