stdlib.h

本文深入解析了C语言中的字符串转换函数(如atof、atoi、atol、strtod、strtol等),随机数生成(rand、srand)、内存管理(calloc、malloc、realloc、free)和环境接口(exit、abort、atexit、system、getenv)等核心知识点,同时介绍了查找与排序算法(bsearch、qsort)、整数运算、多字节字符处理等功能。通过具体的代码实例,详细阐述了每个函数的参数意义、使用方法及应用场景。

原文:http://www.cnblogs.com/happyhotty/articles/2085802.html

1 字符串转换

double atof (const char*);

int atoi (const char*);

long atol (const char*);

double strtod (const char*, char**);

long strtol (const char*, char**, int);

unsigned long strtoul (const char*, char**, int);

1> 第二组函数的参数意义如下:

const char* 指向需要转换的字符串

char**  更新后指向当前数字串之后的一个位置

int  基数(进制数)

2> strtol函数举例:

#include <stdio.h>

#include <ctype.h>

#include <stdlib.h>

int main()

{

 char *buf = "  0B 00 41 42 43 44 45 46 47 48 49  ";

 char *ptr = buf;

 

  while (isspace(*ptr))

  ptr++;

 while (*ptr != '\0')

 {

  printf("%ld\n", strtol(ptr, &ptr, 16));

  while (isspace(*ptr))

   ptr++;

 }

 

 return 0;

}

 

2 随机数

常量

#define RAND_MAX 0x7FFF  rand的最大返回值

函数

void srand (unsigned int);  置随机数发生器(种子)

int rand (void);   返回下一个伪随机数

 

3 内存管理

常量

#define NULL ((void *)0)  空指针

函数

void* calloc (size_t, size_t); 分配内存, 并清零

void* malloc (size_t);  分配内存

void* realloc (void*, size_t); 重新分配内存, 返回新指针

void free (void*);  释放内存

 

4 与环境的接口

常量

#define EXIT_SUCCESS 0

#define EXIT_FAILURE 1

函数

void abort (void);

void exit (int);

int atexit (void (*)(void));

int system (const char*);

char* getenv (const char*);

 

5 查找与排序

void* bsearch (const void*, const void*, size_t, size_t,

                 int (*)(const void*, const void*));

void qsort (const void*, size_t, size_t,

                 int (*)(const void*, const void*));

1> comp函数的返回值

int comp(const void *p1, const void *p2)

{

 const int *pi1 = (const int *)p1;

 const int *pi2 = (const int *)p2;

 return *pi1 - *pi2;

}

若第一个指针所指向的内容, 排序后应该放在第二个指针所指向的内容之前, 那么应返回负值;

反之返回正值; 其他情况返回0. 上例中的comp函数将int数组按升序排序.

2> qsort的调用方法

qsort((void *)list, length, sizeof(int), comp);

 

6 整数运算

结构

typedef struct { int quot, rem; } div_t;

typedef struct { long quot, rem; } ldiv_t;

函数

int abs (int);

long labs (long);

div_t div (int, int);

ldiv_t ldiv (long, long);

 

7 多字节字符

常量

MB_CUR_MAX  多字节字符中的最大字节数

函数

size_t wcstombs (char*, const wchar_t*, size_t);

int wctomb  (char*, wchar_t);

int mblen  (const char*, size_t);

size_t mbstowcs (wchar_t*, const char*, size_t);

int mbtowc  (wchar_t*, const char*, size_t);

 

stdlib.h头文件下的常用函数

atof()将字符串转换成浮点数的函数
原形:double atof(const char *s)
功能:把s所指向的字符串转换成double类型。
   s格式为:符号 数字.数字 E符号 数字
返回值:字符串的转换值。
头文件:math.h、stdlib.h

atoi()将字符串转换成整型数的函数
原形:int atoi(const char *s)
功能:把s所指向的字符串转换成int类型。
   s格式为:符号 数字
返回值:字符串的转换值。若出错则返回0。
头文件:stdlib.h

atol()将字符串转换成长整型数的函数
原形:long atol(const char *s)
功能:把s所指向的字符串转换成long int类型。
   s格式为:符号 数字
返回值:字符串的转换值。若出错则返回0。
头文件:stdlib.h
===================================================
calloc()分配内存函数
原形:void *calloc(size_t nitems,size_t size)
功能:在堆中分配一块内存,将该内存的内容全部清0。
返回值:返回指向新分配内存的指针。空间不够则返回NULL。
头文件:stdlib.h、calloc.h
===================================================
free()释放已分配内存的函数
原形:void free(void *block)
功能:释放由calloc、malloc、realloc函数调用所分配的内存。
头文件:stdlib.h、alloc.h
====================================================
gcvt()把双精度数转化成字符串的函数
原形∶char*gcvt(value,ndigit,buf)
  其中∶double value是待转化数
     int ndigit是转化长度
     char *buf保存转化后的地址
头文件∶stdlib.h
====================================================
geninterrupt()执行中断函数
原形:void geninterrupt(int n)
调用方式:geninterrupt(软中断号)
功能:产生一个8086软中断
注:需先向寄存器传递入口信息(用伪变量)
  例如  伪变量=要赋的值(入口信息);
      调用geninterrupt()函数后得接受出口信息
  例如  变量名=伪变量
伪变量∶Turbo C 允许使用伪变量直接访问相应的8086寄存器。伪变量的类型有两种。
  ① unsigned int : _AX、 _BX、 _CX、 _DX、 _CS、 _DS、 _SS、 _ES、_SP、 _BP、 _DI、 _SI
  ② unsigned char: _AL、 _AH、 _BL、 _BH、 _CL、 _CH、 _DL、 _DH
===================================================
getenv()读取环境变量的当前值的函数
原形:char *getenv(const char *name)
用法:s=getenv("环境变量名");
   需先定义char *s;
功能:返回一给定的环境变量值,环境变量名可大写或小写。如果指定的变量在环境中未定义,则返回一空串。
头文件:stdlib.h
====================================================
itoa()把整形数转换为字符串的函数
原形:char *itoa(int value,char *string,int radix)
功能:把value的值转换为以NULL结束的字符串,并把结果存在string中。radix是转换的基数值,在2到36之间。分配给string的空间必须可容纳返回的所有字节(最多17字节)。
返回值:指向string的指针
头文件:stdlib.h
==================================================
_lrotl()将一个无符号长整形数左循环移位的函数
原形:unsigned long _lrotl(unsigned long value,int count)
功能:将value向左循环移动count位。
返回值:将value向左循环移动count位后的值。
头文件:stdlib.h

_lrotr()将一个无符号长整形数右循环移位的函数
原形:unsigned long _lrotr(unsigned long value,int count)
功能:将value向右循环移动count位。
返回值:将value向右循环移动count位后的值。
头文件:stdlib.h



ltoa()把长整形数转换为字符串的函数
原形:char *ltoa(long value,char *string,int radix)
功能:把value的值转换为以NULL结束的字符串,并把结果存在string中。radix是转换的基数值,在2到36之间。分配给string的空间必须可容纳返回的所有字节(最多33字节)。
返回值:指向string的指针
头文件:stdlib.h

malloc()分配内存函数
原形:void *malloc(size_t size)
功能:从堆中分配大小为size字节的块。win32也适用。
返回值:返回新分配内存的地址,若无足够内存,返回NULL。
头文件:alloc.h、stdlib.h
============================================================
putenv()将字符串放入当前环境中的函数
原形:int putenv(const char *name)
用法例:putenv("PATH=C:\B\TC");
功能:把字符串name加到当前程序运行的环境中。当程序结束后,原环境将得到恢复。
返回值:0(成功);-1(失败)
头文件:stdlib.h
============================================================
realloc()重新分配内存函数
原形:void *realloc(void *block,size_t size)
   block指向用malloc、calloc或realloc已得到的内存。
   size是重新分配的字节。
返回值:重分配的块地址。若不能重分配,则返回NULL。
头文件:stdlib.h
=============================================================
_rotl()将一个无符号整形数左循环移位的函数
原形:unsigned _rotl(unsigned value,int count)
功能:将value向左循环移动count位。
返回值:将value向左循环移动count位后的值。
头文件:stdlib.h
=============================================================
_rotr()将一个无符号整形数右循环移位的函数
原形:unsigned _rotr(unsigned value,int count)
功能:将value向右循环移动count位。
返回值:将value向右循环移动count位后的值。
头文件:stdlib.h


#include #include struct DATA { int ID; char name[4]; char sex[3]; int score; }; void paixu(int*,DATA*,int); int sishewuru(double); void func1(int*,int*,DATA*,int*,int,int,int,int);//统计男女比例 int func2(int*,int,DATA*);//查找考生序号 void print(); void main() { int length=0,i,yiben,erben,sanben,dazhuan,male[4],female[4]; int yi,er,san,si; char input; FILE* file=fopen("f1.txt","r"),*file1; if(file==NULL) { printf("No such file!\n"); return; } while(EOF!=fscanf(file,"%*[^\n]\n")) length++;//自动计算考生数罝ATA* data=(DATA*)malloc(length*sizeof(DATA)); int* pai=(int*)malloc(length*sizeof(int)); rewind(file); for(i=0;i='0'&&input<='4')) { printf("非法输入,请重新输入\n请输入:"); fflush(stdin); } else break; } getchar(); switch(input) { case '0': printf("\n一类本科招生线:%d\n二类本科招生线:%d\三类本科招生线:%d\\n高职高专招生线:%d\n",yi,er,san,si); printf("是否打印为文件?(y/n):"); if(getchar()=='y') { file1=fopen("各批次录取分数线.txt","w"); fprintf(file1,"一类本科招生线:%d\n二类本科招生线:%d\\n三类本科招生线:%d\n高职高专招生线:%d\n",yi,er,san,si); fclose(file1); } fflush(stdin); break; case '1': func1(male,female,data,pai,yiben,erben,sanben,dazhuan); printf("一类本科招生线男女比例:%d:%d\n",male[0],female[0]); printf("二类本科招生线男女比例:%d:%d\n",male[1],female[1]); printf("三类本科招生线男女比例:%d:%d\n",male[2],female[2]); printf("高职高专招生线招生线男女比例:%d:%d\n",male[3],female[3]); printf("是否打印为文件?(y/n):"); if(getchar()=='y') { file1=fopen("各批次录取男女比例.txt","w"); fprintf(file1,"一类本科招生线男女比例:%d:%d\n",male[0],female[0]);
<think>首先,用户的问题是:“我想了解 stdlib.h 是什么”。这是一个关于C语言的stdlib.h头文件的查询。 从系统级指令,我需要: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户提供了几个引用: - 引用[1]: stdlib.h是一些常用的函数,定义了一些类型。 - 引用[2]: 定义了五种类型、一些宏和通用工具函数,如size_t, wchar_t等。 - 引用[3]: 定义了四个变量类型、一些宏和各种通用工具函数,并举例了atof函数。 - 引用[4]: 列出了一些函数如atof, atoi, malloc等。 - 引用[5]: 讨论了return 0; vs exit(0);,并提到变量类型。 我需要基于这些引用,结合我的知识,回答用户的问题。用户的问题是“stdlib.h 是什么”,所以我应该给出一个清晰、结构化的解释。 回答结构:指令说“回答结构清晰,帮助用户逐步解决问题”。所以,我应该: 1. 定义stdlib.h是什么。 2. 解释它的作用和用途。 3. 列出它包含的主要内容(如类型、宏、函数)。 4. 给出一些例子来阐明。 5. 自然地添加引用标识。 最后,生成相关问题。 大纲: - 开头:解释stdlib.h是C语言标准库的头文件之一,提供通用功能和工具。 - 主要内容: - 类型:如size_t, div_t等。 - 宏:如EXIT_SUCCESS, EXIT_FAILURE等。 - 函数:如内存管理函数(malloc, free)、数学函数(atoi, atof)、流程控制(exit, abort)、排序和搜索(qsort, bsearch)等。 - 例子:简短提到一些常用函数,如使用atof转换字符串到浮点数。 - 结尾:总结重要性。 - 相关问题生成。 引用使用:在回答中,当提到具体内容时,自然地添加引用标识。例如,当说到函数列表时,引用[4];当说到atof时,引用[3];当说到类型时,引用[1]或[2]。 确保使用中文回答。 相关问题:指令说“生成相关问题”。基于主题,我应该生成3个左右的问题,类似于示例中的风格。例如: 1. stdlib.h中一些常用函数的具体用法? 2. 如何在C程序中使用stdlib.h进行内存管理? 3. stdlib.h与其他头文件如stdio.h的区别? 完整回答结构: 1. 解释stdlib.h是什么。 2. 详细介绍其内容: - 类型 - 宏 - 函数类别 3. 举例或代码片段(如果需要,但用户没有要求代码,所以可能省略或简短提及)。 4. 结尾。 5. 生成相关问题。 代码:在回答中,我可以包括一个简单的代码示例来展示如何使用stdlib.h的函数,比如atof或malloc。但用户没有明确要求代码,所以我应该根据上下文决定。在引用[3]中有代码示例,我可以参考它。 最终输出: - 回答部分:结构化,用分段。 - 相关问题:用§§相关问题§§标记。 </think>### stdlib.h 是什么 stdlib.h 是C语言标准库中的一个核心头文件,全称为“standard library header”。它提供了一系列常用的函数、类型和宏,用于处理通用的编程任务,如内存管理、数学转换、程序流程控制等。根据ISO C标准,stdlib.h 包含的内容不属于其他特定头文件(如 stdio.h 负责输入输出),而是集合了那些“通用工具”功能。这使得它在C程序开发中非常常见且重要,常用于实现基础操作,如动态内存分配、字符串转数字、程序退出控制等[^1][^2]。 #### stdlib.h 的主要作用 - **核心功能**:stdlib.h 充当一个工具包,提供跨平台的标准化接口。例如,在内存管理中,它允许程序动态分配和释放内存;在数学转换中,它能将字符串解析为数值类型。 - **优点**:使用 stdlib.h 可以提高代码的可移植性和效率,因为其函数已在不同编译器中优化实现。如果没有它,开发者可能需要手动编写底层操作,增加复杂性和错误风险[^2][^4]。 #### stdlib.h 包含的主要内容 基于C语言标准,stdlib.h 定义了以下三类元素: 1. **类型定义**: - 包括 `size_t`(用于表示对象大小,如数组长度)、`wchar_t`(宽字符类型)、`div_t`(用于整数除法的结果结构)等。这些类型确保了数据处理的兼容性和安全性。例如,`size_t` 常用于数组索引和内存分配函数中[^1][^2][^5]。 2. **宏定义**: - 提供了预定义的常量,如 `EXIT_SUCCESS`(表示程序正常退出)、`EXIT_FAILURE`(表示程序异常退出)、`RAND_MAX`(随机数生成的最大值)等。这些宏简化了程序状态管理。例如,在 `main()` 函数结束时,使用 `exit(EXIT_SUCCESS)` 可以直接终止程序[^2][^5]。 3. **常用函数**: - stdlib.h 包含了广泛的工具函数,主要分为几类: - **数值转换函数**:如 `atof()`(字符串转浮点数)、`atoi()`(字符串转整数)。这些函数解析字符串并返回数值类型,常用于用户输入或文件读取。例如: ```c #include <stdio.h> #include <stdlib.h> int main() { char str[] = "123.45"; double num = atof(str); // 将字符串转为 double printf("转换结果: %f\n", num); // 输出: 123.450000 return 0; } ``` 参考示例显示,`atof()` 能将数值字符串转换为浮点数,但非数字字符串会返回0.0,体现了其易用性和局限性[^3][^4]。 - **内存管理函数**:如 `malloc()`(分配内存)、`free()`(释放内存)、`realloc()`(重新分配内存)。这些函数支持动态数据结构(如链表或树)的构建。例如,`malloc(sizeof(int) * 10)` 分配10个整型空间[^4][^5]。 - **流程控制函数**:如 `exit()`(立即终止程序)、`abort()`(异常终止)、`system()`(执行系统命令)。`exit()` 与 `return` 不同:`exit(0)` 直接结束整个程序,而 `return 0` 在递归函数中只返回上一级调用[^5]。 - **其他实用函数**:如 `rand()`(生成伪随机数)、`qsort()`(快速排序数组)、`bsearch()`(二分查找)。这些函数增强了算法的实现效率[^2][^4]。 #### 为什么使用 stdlib.h 在C程序中,包含 stdlib.h(例如 `#include <stdlib.h>`)是标准做法,因为它: - 简化开发:无需重新发明基础功能,减少编码时间。 - 保证兼容性:遵循ISO标准,确保代码在不同平台上一致运行。 - 错误处理:内置函数如 `exit()` 提供可靠的程序退出机制,避免资源泄漏[^1][^5]。 总之,stdlib.h 是C语言开发中不可或缺的部分,尤其适用于底层系统编程、数值计算和工具开发。如果您有具体函数的使用疑问,可以提供更多细节进一步探讨!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值