C语言常用功能函数集合
说明:作者将个人接触到的C语言功能函数记录下来,组成一个集合,便于查阅和加深印象。
1. 内存相关
malloc()函数 :申请一片连续的堆内存,字节为单位。分配所需的内存空间,并返回一个指向它的指针。用完注意用free函数释放该内存,防止内存泄漏。
#include <stdlib.h>
void *malloc(size_t size)
例如:char *Buf;
BufLen = BUFSIZE; //BUFSIZE为整数
Buf = (char *)malloc(BufLen); // char *可根据需求更改
memset()函数 :为新申请的内存进行初始化工作,字节为单位。
函数的功能是:将指针变量 s 所指向地址为起点,对其后 n 字节的内存单元用一个“整数” c 替换,注意 c 是 int 型。s 是 void* 型的指针变量,所以它可以为任何类型的数据进行初始化。
# include <string.h>
void *memset(void *s, int c, unsigned long n);
例如: memset(Buf, 0x00, BufLen);
memcpy() 函数: 从存储区 str2 复制 n 个字节到存储区 str1。
include <string.h>
void *memcpy(void *str1, const void *str2, size_t n)
例如1:char *s="http://www.runoob.com";
char d[20]; memcpy(d, s+11, 6); // 从第 11 个字符(r)开始复制,连续复制 6 个字符(runoob)
// 或者 memcpy(d, s+11*sizeof(char), 6*sizeof(char));
d[6]='\0';
printf("%s", d);
例如2:
#define SPL_HEADER "****************"
char *Buf;
memcpy(&Buf[0], SPL_HEADER, SPL_HEADER_SIZE); //SPL_HEADER_SIZE = 16
补充知识:
#include<stdio.h>
int main()
{
char *pMem;
pMem = (char *)malloc(10);
printf("pMem = %p\n",pMem);
printf("&pMem[0] = %p\n",&pMem[0]);
printf("&pMem[1] = %p\n",&pMem[1]);
printf("&pMem[2] = %p\n",&pMem[2]);
printf("&pMem[3] = %p\n",&pMem[3]);
return 0;
}
编译结果:
pMem = 0x15deb10
&pMem[0] = 0x15deb10
&pMem[1] = 0x15deb11
&pMem[2] = 0x15deb12
&pMem[3] = 0x15deb13
2. 文件相关
fopen()函数:打开一个文件并返回文件指针。配套fclose()函数使用。
头文件:#include <stdio.h>
fopen()是一个常用的函数,用来以指定的方式打开文件,其原型为:
FILE * fopen(const char * path, const char * mode);
【参数】path为包含了路径的文件名,mode为文件打开方式。
例如1:FILE * fstream;
fstream=fopen("test.txt","at+");
fclose(fstream);
例如2:FILE * fp;
// 3.1 打开源bin
fp = fopen(argv[1], "rb"); //argv[1]为文件名的指针,指向的为char类型
fseek()函数:用来移动文件流的读写位置.
头文件:#include <stdio.h>
定义函数:int fseek(FILE * stream, long offset, int whence);
返回值:当调用成功时则返回0, 若有错误则返回-1
1、参数stream 为已打开的文件指针,
2、参数offset 为根据参数whence 来移动读写位置的位移数。参数 whence 为下列其中一种:
SEEK_SET 从距文件开头offset 位移量为新的读写位置. SEEK_CUR 以目前的读写位置往后增加offset 个位移量.
SEEK_END 将读写位置指向文件尾后再增加offset 个位移量. 当whence 值为SEEK_CUR 或SEEK_END 时, 参数offset 允许负值的出现.
下列是较特别的使用方式:
1) 欲将读写位置移动到文件开头时:fseek(FILE *stream, 0, SEEK_SET);
2) 欲将读写位置移动到文件尾时:fseek(FILE *stream, 0, SEEK_END);
ftell()用来取得文件流目前的读写位置. 参数stream 为已打开的文件指针.
定义函数:long ftell(FILE * stream);
返回值:当调用成功时则返回目前的读写位置, 若有错误则返回-1
例如:fileLen = ftell(fp);
fread()函数:用于从文件流中读取数据
其原型为:头文件:#include <stdio.h>
size_t fread(void *buffer, size_t size, size_t count, FILE * stream);
【参数】buffer为接收数据的地址,size为一个单元的大小,count为单元个数,stream为文件流。
fread()函数每次从stream中最多读取count个单元,每个单元大小为size个字节,将读取的数据放到buffer;文件流的位置指针后移 size * count 字节。
【返回值】返回实际读取的单元个数。如果小于count,则可能文件结束或读取出错;可以用ferror()检测是否读取出错,用feof()函数检测是否到达文件结尾。
fwrite()函数以二进制方式向文件流中写入数据,其原型为:
size_t fwrite(void * buffer, size_t size, size_t count, FILE * stream);
【返回值】返回成功写入的单元个数。如果小于count,则说明发生了错误,文件流错误标志位将被设置,随后可以通过ferror()函数判断。
例如: nbytes = fwrite( a, 1, BufLen, fp);
if ( nbytes != BufLen )
{
printf("destination file write error\n");
free(Buf);
fclose(fp);
return -1;
}