C语言从头学62——学习头文件stdlib.h(一)
stdlib.h是一个非常重要的头文件,其中定义了使用频率很高的宏、函数等。
一、数据类型
size_t:运算符sizeof的返回值类型
wchar_t:宽字符类型
二、宏
NULL:空指针(用于声明后但未使用的指针的赋初值)
EXIT_SUCCESS:函数运行成功时的退出状态
EXIT_FAILURE:函数运行错误时的退出状态
RAND_MAX:rand() 函数可以返回的最大值
MB_CUR_MAX:当前语言环境中,多字节字符占用的最大字节数
三、stdlib中的函数
1、函数abs()
功能:计算int型整数的绝对值
使用格式:abs(参1);
参1:整型数值或变量
返回值:返回参1的绝对值
说明:abs函数是计算int类型绝对值的;还有用于long和longlong类型的函数,它们是labs(),llabs(),用法一样。
2、函数div()
功能:计算两个整型数相除的商和余数。
使用格式:div(参1,参2);
参1:被除数(int型)
参2:除数(int型)
返回值:商和余数两个值怎样返回呢?它返回的是一个结构体,我们用div_t结构体声明的变量 接收即可。这个结构体有两个属性:quot—商、rem—余数,均为int类型。
说明:和abs一样,计算long型、long long型的函数为:ldiv(),lldiv(),对应的接收结构体为ldiv_t和lldiv_t,结构体属性名与前面相同。
3、字符串转成整型函数atoi()
功能:将字符串转成int类型数值
使用格式:atoi(参1);
参1:由数字组成的字符串
返回值:返回转换后的int型数值,对于非可转换字符则返回0。
说明:
a.如果字符串是以空格开头的,后边才是数字,空格会被忽略;
b.数字后边还跟着非数字字符,则转换到第一个非数字字符就停止,非数字字符后边再有数字也不再转换;
c.如果字符串以非数字字符开头,与不包含数字的字符串一样,转换结果会是0;
d.因为涉及数据类型,字符串转数值函数也有好几个,它们的使用方法与atoi相似:
atof():字符串转成 double 类型(头一个小数点会被正常转换,再出现小数点连同后边的数字不再转换)
atol():字符串转成 long int 类型
atoll():字符串转成 long long int 类型
4、字符串转浮点数函数strtof()
功能:将字符串转成float类型数值
使用格式:strtof(参1, 参2);
参1:被转换的字符串
参2:一个字符串指针用于接收参1中不能转换部分字符串(字符串本身就是指针,再指向字符串,相当于char**)
参1中如无不可转换部分或者不需要处理,参2则可以写成NULL
返回值:返回float类型的转换后的数值,字符串是不可转换字符返回0。
说明:
a. 如果字符串前端有空格,函数会忽略空格。
b. 如果头一个字符是不可转换字符,则后边的即使可以转换也转换不了,返回0。
c. 这个函数也有其他类型版本,如:strtod()—转成double类型、strtold()—转成long double类型、
5、字符串转整型数函数(带进制)strtol()
功能:将字符串转换成所需进制的整型数
使用格式:strtol(参1,参2,参3);
参1:被转换字符串
参2:指向不能转换字符的指针。这个参数如果设为 NULL,则不对不可转换字符进行处理。
参3:规定转换结果的进制(以整型数方式设置)
返回值:返回转换后的结果,类型为long int。
说明:
a. 由于有了参3,故有些非数字字符也变成了数字字符,如16进制的ABCDEF。
b. 字符串中表示进制的如:0,0x等不影响转换结果,有无均可,七决定作用的是参3。
b. 这个函数除了多了一个参3引起的一些变化外,其余情况和上一个函数相似。
c. 这个函数也有其它数据类型的版本,如:strtoll()—字符串转成long long int类型、strtoul()—字符串转成unsigned long int类型、strtoull()—字符串转成unsigned long long int类型;使用方法相似。
以上函数的实验程序如下:
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
//数据类型字节数
printf("size_t占字节数:%lld\n", sizeof(size_t));//运行结果:size_t占字节数:8
printf("wchar_t占字节数:%lld\n", sizeof(wchar_t));//运行结果: wchar_t占字节数:2
//实验绝对值函数abs()
int a = -100;
printf("a的绝对值:%d\n",abs(a));//运行结果:a的绝对值:100
//实验求商、求余函数div()
a = 65;
int b = 9;
div_t c = div(a, b);
printf("a除以b的商是%d 余数是%d\n", c.quot, c.rem);//运行结果:a除以b的商是7 余数是2
//字符串转数值atoi
char* s = " 123asd";
a = atoi(s);
printf("字符串s转成的数字为:%d\n",a);//运行结果:字符串s转成的数字为:123
double x = atof("3.1415926");//运行结果:x = 3.1415926
printf("x=%.7f\n", x);
//字符串转数值strtof()
s = "123.45678ABCDEF22";
char* s2;
float y = strtof(s,&s2); //转换成float类型并用s2接收不可转换部分
printf("转换后的浮点数:%f\n", y);//运行结果:转换后的浮点数:123.456779
printf("不可转换部分字符为:%s\n", s2);//运行结果:不可转换部分字符为:ABCDEF22
s = "5000.2345";
double y1 = strtod(s, NULL);
printf("s转换后的值为:%f\n", y1); //运行结果:s转换后的值为:5000.234500
//字符串转整型数strtol()
s = "0xffffg";
long int i = strtol(s,&s2,16);
printf("i的十进制值:%d 未转换:%s\n", i, s2);//运行结果:i的十进制值:65535 未转换:g
s = "10111111";
printf("s转换后十进制值:%d\n",strtol(s,NULL,2));//运行结果:s转换后十进制值:191
getchar();
return 0;
}