1)C语言中内存操作相关函数
void *malloc(size_t size); //返回一个指针,指向已分配指定大小的内存,失败则返回NULL //这块内存空间在函数执行完成后不会被初始化,他们的值是随机的,在使用完该内存空间后记得free() //如果希望在分配内存的同时进行初始化,可以参考calloc()函数 void *calloc(size_t nitems,size_t size); //nitems---要被分配的元素个数,size---单个元素的大小 //分配所需的内存空间,并返回一个指向它的指针 //malloc()和calloc()的主要区别是malloc()不会给分配的内存空间初始化,而calloc()是会初始化内存空间的 //该函数返回一个指针,指向已分配的内存,如果请求失败,则返回NULL void *realloc(void *ptr,size_t size); //ptr---指向一个要重新分配内存的内存块,该内存块之前是通过malloc(),calloc()或者realloc()进行分配内存的,如果ptr是一个空指针,则会分配一个新的内存块,并且函数返回一个指向这个内存块的指针 //size---内存块的新的大小,以字节为单位,如果大小为0,且ptr指向一个已经存在的内存块时,则ptr指向的内存块被释放(可以使用realloc()替代free()函数释放申请的内存空间),并返回一个空指针 //请求失败返回NULL //重新调整之前调用malloc(),realloc或者calloc()函数申请分配的内存空间大小 void *memcpy(void *str1,const void *str2, size_t n); //str1---指向用于存储复制内容的目标数组,类型强制转换为void *指针 //str2---指向要复制的数据源,类型强制转换为void *指针 //n---要被复制的字节数 //返回一个指向目标存储区str1的指针 //从存储区str2复制n个字节到存储区str1 //比strcpy()更强,strcpy()复制字符串 void *memchr(const void *str, int c, size_t n); //str---指向要执行搜索的内存块 //c---以int形式传递的值,但是函数在每次字节搜索时是使用该值的无符号字符形式 //n---要被分析的字节数 //返回一个指向匹配字节的指针,如果在给定的内存区域未出现字符,则返回NULL //在参数str所指向的字符串的前n个字节中搜索第一次出现字符c(一个无符号字符)的位置 int memcmp(const void *str1, const void *str2, size_t n); //str1---指向比较内存块的指针 //str2---指向比较内存块的指针 //n---要比较的字节数 //str12)判断字符类型的相关函数
#includeint isdigit(int c); //如果C是一个十进制数字则该函数返回一个非零值,否则返回0 int isxdigit(int c); //是否是十六进制数字 int isalpha(int c); //判断是否是一个字母 int issalnum(int c); //是否是字母和数字 int iscntrl(int c); //是否是控制字符 int islower(int c); //是否是小写字母 int isupper(int c); //是否是大写字母 int isspace(int c); //是否是空白字符 int tolower(int c); //把大写字母转换为小写字母 int toupper(int c); //小写转大写 3)字符串和其他数值类型进行转换的相关函数
#includeint atoi(const char *str); //str---要转换为整数的字符串 //返回转换后的整数,如果没有执行有效的转换,则返回0 double atof(const char *str); //str---要转换为浮点数的字符串 //返回转换后的双精度浮点数,如果没有执行有效转换则返回0 long int strtol(const char *str, char **endptr, int base); //str---要转换为长整数的字符串 //endptr---对类型为char *对象的引用,其值由函数设置为str中数值后的下一个字符 //base---基数,基于(2,36]之间,也包含0 //返回转换后的长整数,如果没有执行有效转换,则返回0 //把参数str所指向的字符串根据给定的base转换为一个长整数(long int) 4)字符串常用函数
size_t strlen(const char *str); //str---要计算长度的字符串 //返回字符串的长度(不包括' ') size_t strnlen(const char *s, size_t maxlen); //s---要计算长度的字符串 //maxlen---如果要计算长度的字符串长度<=maxlen,则返回实际长度;如果>maxlen,则返回maxlen char *strchr(const char *str, int c); //str---要被检查的字符串 //c0---在str中搜索的字符 //返回字符串str中第一次出现字符C的位置(字符指针),如果未找到该字符则返回NULL //在str所指向的字符串中搜索第一次出现字符C(一个无符号)的位置 char *strrchr(const char *str,int c); //str---要搜索的字符串 //c---要搜索的字符 //返回str中字符c最后一次出现的位置,如果未找到,则返回NULL char *strpbrk(const char *str1, const char *str2); //str1---要被检查的C字符串 //str2---该字符串包含了要在str1中进行匹配的字符列表 //返回str1中第一个匹配字符串str2中字符的字符指针,如果未找到则返回NULL //检索字符串 str1,在str1中查找是否出现str2中包含的字符,如果有则返回指向该字符的指针 char *strstr(const char *str1, const char *str2); //str1---要被检索的字符串 //str2---在被检索字符串内要搜索的子字符串 //返回指向在检索字符串str1中第一次出现子字符串str2的位置的指针,找不到则返回NULL char *strtok(char *str1, const char *str2); //str1---要被分解成一组小字符串的字符串 //str2---包含分隔符的字符串 //返回被分解的第一个子字符串,如果没有可检索的字符串,则返回指向str1的指针 //分解字符串str1为一组子字符串,str2为分隔符,会改变str1的内容,将str1中与str2子字符串匹配的首字符设置为' ' //第一次调用时,需要指定str1,接下来的几次调用只需要赋值NULL,即可对str1进行后续分割,直至分割结束 char *strcat(char *dest, const char *src); //dest:指向目标数组,该数组包含一个C字符串,且足够容纳追加后的字符串 //src:指向要追加的字符串,该字符串不会覆盖目标字符串 //返回一个指向最终的目标字符串dest的指针 char *strcpy(char *dest, const char *src); //dest:指向用于存储复制内容的目标数组 //src:要复制的字符串 //返回一个指向最终目标字符串的dest指针5)文件操作的相关函数
#include#include FILE *fopen(const char *filename, const char *mode); //filename:字符串,表示要打开的文件名称 //mode:字符串,表示文件的访问模式, ----------------------------- r 以只读方式打开文件,该文件必须存在。 r+ 以可读写方式打开文件,该文件必须存在。 rb+ 读写打开一个二进制文件,允许读数据。 rw+ 读写打开一个文本文件,允许读和写。 w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。 w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。 a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留) a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留) wb 只写打开或新建一个二进制文件;只允许写数据。 wb+ 读写打开或建立一个二进制文件,允许读和写。 ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。 at+ 打开一个叫string的文件,a表示append,就是说写入处理的时候是接着原来文件已有内容写入,不是从头写入覆盖掉,t表示打开文件的类型是文本文件,+号表示对文件既可以读也可以写。 上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库以二进制模式打开文件。如果不加b,表示默认加了t,即rt,wt,其中t表示以文本模式打开文件。由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考umask 值。 有些C编译系统可能不完全提供所有这些功能,有的C版本不用"r+","w+","a+",而用"rw","wr","ar"等,读者注意所用系统的规定。 二进制和文本模式的区别 1.在windows系统中,文本模式下,文件以"rn"代表换行。若以文本模式打开文件,并用fputs等函数写入换行符"n"时,函数会自动在"n"前面加上"r"。即实际写入文件的是"rn" 。 2.在类Unix/Linux系统中文本模式下,文件以"n"代表换行。所以Linux系统中在文本模式和二进制模式下并无区别。 ----------------------------- #include char *strerror(int errnum); //errnum:错误号,通常是errno //返回一个指向错误字符串的指针,该错误字符串描述了错误errnum //strerror生成的错误字符串取决于开发平台和编译器 printf("%s",strerror(errno)); ----------------------------- void perror(const char *str); //str:C字符串,包含一个自定义的消息,将显示在原本的错误消息之前 //把一个描述性错误消息输出到标准错误stderr,首先输出字符串str,后跟一个冒号,然后是一个空格 perror("Error "); ----------------------------- int ferror(FILE *stream); //stream:这是指向FILE对象的指针,该FILE对象标识了流 //如果设置了与流关联的错误标识符,该函数返回一个非零值,否则返回一个零值 FILE *fp = fopen("file.txt"."r+"); if(ferror(fp)){ printf("读取文件时发生错误"); } fclose(fp); -------------------------------- int feof(FILE *stream); //stream:这是指向FILE对象的指针,该FILE对象标识了流 //检测到文件结束符,该函数返回一个非零值,否则返回零。 //检测当前文件流上的文件结束符,判断是否读到了文件末尾 FILE *fp = fopen("file.txt","r+"); if(feof(fp)){ printf("文件读取到末尾了"); } fclose(fp); ----------------------------- int setvbuf(FILE *stream, char *buffer, int mode, size_t size); //stream:这是指向FILE对象的指针,该FILE对象标识了一个打开的流 //buffer:这是分配给用户的缓冲,如果设置为NULL,该函数会自动分配一个指定大小的缓冲区 //mode:这是指定文件缓冲的模式 //size:指定缓冲区的大小,以字节为单位 //给流stream指定缓冲区和缓冲模式,缓冲区大小,接下来对stream进行的输出输入操作都会使用指定的缓冲区和缓冲模式 缓冲模式----------------------------- _IOFBF:全缓冲、对于输出,数据在缓冲区填满时被一次性写入;对于输入,缓冲会在请求输入且缓冲区为空时被填充 _IOLBF:行缓冲、对于输入,数据在遇到换行符或者在缓冲区填满时被写入;对于输入,缓冲区会在请求输入且缓冲区为空时被填充,直到遇到下一个换行符 _IONBF:无缓冲、不使用缓冲,每隔IO操作都被即时写入。buffer和size参数被忽略 ----------------------------- C11之后的编译器fflush()函数已经不能起到清空缓冲区的作用了,可以使用rewind()和scanf()清空缓冲区 int fflush(FILE *stream); //stream---这是指向FILE对象的指针,该FILE对象已经被指定了一个缓冲区 //成功则返回零值,错误则返回EOF,且设置错误标识符 //清空文件的缓冲区或者标准输入输出的缓冲区,如果文件是以写的方式打开的,那么在清空缓冲区之前将内容写入文件中。 ----------------------------- int getc(FILE *stream); //stream:这是指向FILE对象的指针,该FILE对象标识了要在上面执行操作的流 //以无符号char强制转换为int的形式返回读取的字符,如果到达文件末尾或发生错误,则返回EOF #define EOF (-1) //从指定的流stream获取下一个字符(一个无符号字符),并把位置标识符向前移动 ----------------------------- int putc(int char, FILE *stream); //char:要被写入的字符,该字符以其对应的int值进行传递 //stream:这是指向FILE对象的指针,该FILE对象标识了要被写入字符的流 //以无符号 char 强制转换为 int 的形式返回写入的字符,如果发生错误则返回 EOF //把参数char指定的字符(一个无符号字符)写入指定的流stream中,并把位置标识符向前移动 ----------------------------- #include int getch(void); //是编程中所用的函数,这个函数是一个不回显函数,当用户按下某个字符时,函数自动读取,无需按回车,有的C语言命令行程序会用到此函数做游戏,但是这个函数并非标准函数,要注意移植性! ----------------------------- char *gets(char *str); //str:指向一个字符数组的指针,该数组存储了C字符串 //成功则返回指向str的指针,如果发生错误或者到达文件末尾时还未读取任何字符,则返回NULL //从标准输入stdin读取一行,并把它存储在str所指向的字符串中,当读取到换行符时,或者到达文件末尾时,它会停止。 ----------------------------- int puts(const char *str); //str:要被写入的字符串 //成功则返回0,如果发生错误则返回EOF //把一个字符串写入到标准输出stdout中,直到空字符,但不包括空字符,末尾追加换行符,字符串中的转义字符(换行符等)正常输出 --------------------------------------------- int fgetc(FILE *stream); //stream:指向FILE对象的指针,该FILE对象标识了要在上面指向操作的流 //以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。 //从指定流stream获取下一个字符(一个无符号字符),并把位置标识符向前移动 ----------------------------- int fputc(int ch, FILE *stream); //ch:要被写入的字符 //stream:要写入的FILE对象指针所指向的流对象 //成功则返回被写入的字符,发生错误则返回EOF,并设置错误标识符 ----------------------------- char *fgets(char *str, int n, FILE *stream); //str:指向一个字符数组的指针,该数组存储了要读取的字符串 //n:要读取的最大字符数(包括最后的空字符) //stream:指向一个具体的流对象 //成功则返回指向str的指针,如果到达文件末尾或者没有读取到任何字符,则返回一个空指针,str内容不变 //从指定流stream读取一行,并把它存储在str所指向的字符串内,当读取到(n-1)个字符,或者读取到换行符,或者到达文件末尾时,读取停止 ----------------------------- int fputs(const char *str, FILE *stream); //str:要写入的以空字符终止的字符序列 //stream:指向要写入字符串的流 //成功则返回一个非负值,失败则返回EOF //把字符串写入到指定的流stream中,但不包括空字符 ----------------------------- size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); //ptr:指向最小尺寸为size*nmemb个字节的内存块 //size:要读取的元素的大小,以字节为单位 //nmemb:要读取的元素的个数,每个元素大小为size个字节 //stream:指向要读取的流对象 //成功则返回一个size_t整型数据数据,大小为成功读取元素的个数,如果成功读取总数和nmemb不匹配,则可能发生了一个错误或者是到达了文件末尾 //从给定的流对象读取数据到ptr所指向的内存空间 ----------------------------- size_t fwrite(const void *ptr, size_t size, sieze_t nmemb, FILE *stream); //ptr:要被写入的元素数组的指针 //size:要被写入的单个元素的大小,以字节为单位 //nmemb:要写入的元素个数,单个元素大小为size个字节 //stream: 指向写入文件流对象 //把ptr所指向的数组中的数据写入到给定流stream中 ----------------------------- int fseek(FILE *stream, long int offset, int whence); //stream:指向文件流对象 //offset:相对于whence的偏移量,以字节为单位:负值前移,正值后移 //whence:开始位置 SEEK_SET:文件的开头 SEEK_CUR:文件指针当前的位置 SEEK_END:文件的末尾 //成功则返回0,失败则返回非零值 //设置流stream的文件位置 ----------------------------- void rewind(FILE *stream); //stream:指向文件流对象 //设置文件位置指针重新设置为流stream的文件的开头 ----------------------------- int scanf(const char *format, ...); //format:这是C格式化字符串 //...可变参数,接收变量的地址 //从stdin中读取格式化输入 //成功则返回成功匹配和赋值的个数 ,如果到达文件末尾或者发生错误,则返回EOF ----------------------------- int sscanf(const char *str, const char *format, ...); //str:指向字符串的指针 //format:格式化字符串 //...:可变长参数,读取变量存放地址 //从字符串读取格式化输入 ----------------------------- int fscanf(FILE *stream, const char *format, ...); //stream:指向流对象的指针 //format:格式化字符串 //...:可变长参数,读取变量存放的地址 //从流stream中读取格式化输入按照格式化字符串的格式到指定的变量地址 ----------------------------- int printf(const char *format, ...); //format:格式化字符串 ///...:可变长参数 //发送格式化字符串到标准输出stdout ----------------------------- int sprintf(char *str, const char *format, ...); //str:指向字符数组的指针 //format:格式化字符串 //...:可变长参数 //发送格式化字符串到str所指向的字符串 ----------------------------- int fprintf(FILE *stream, const char *format, ...); //stream:指向文件流对象的指针 //format:格式化字符串 //...:可变长参数 //发送格式化字符串到文件流stream ----------------------------- FILE *freopen(const char *filename, const char *mode, FILE *stream); //filename:要打开的文件名称 //mode:设置文件访问模式 "r" 打开一个用于读取的文件。该文件必须存在。 "w" 创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。 "a" 追加到一个文件。写操作向文件末尾追加数据。如果文件不存在,则创建文件。 "r+" 打开一个用于更新的文件,可读取也可写入。该文件必须存在。 "w+" 创建一个用于读写的空文件。 "a+" 打开一个用于读取和追加的文件。 //stream:指向文件流的指针,标识了要被重新打开的流 //如果文件成功打开,则函数返回一个指针,否则返回空指针 //把一个新的文件名filename与给定的打开的流关联,同时关闭流中的旧文件。用于文件流的重定向,一般将stdout,stdin,stderr重定向到文件 ----------------------------- int fileno(FILE *stream); //stream:指向文件流的指针 //返回文件描述符 //用来获取参数stream指定的文件流所使用的文件描述符 FILE *fp = fopen("/etc/passwd", "r"); int fd = fileno(fp); printf("fd=%dn", fd); fclose(fp); ----------------------------- #include int dup(int oldfd); //oldfd:旧的文件描述符 //成功则返回最小尚未使用的文件描述符,错误则返回-1,errno会存放错误代码 //修改旧的文件描述符指向的文件对象的描述符为最小的未使用的描述符 ----------------------------- int dup2(int oldfd, int newfd); //oldfd:文件流对象旧的描述符 //newfd:文件流对象新的文件描述符 //成功则返回0,失败则返回-1 //给文件流对象指定新的文件描述符 ----------------------------- void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *)); //base:指向要排序的数组的第一个元素的指针 //nitems:由base指向的数组中元素的个数 //size:数组中每个元素的大小,以字节为单位 //compar::用来比较两个元素的函数 //对指定数组进行排序,修改数组内容 int values[] = { 88, 56, 100, 2, 25 }; int cmpfunc (const void * a, const void * b) { return ( *(int*)a - *(int*)b ); } int main() { int n; printf("排序之前的列表:n"); for( n = 0 ; n < 5; n++ ) { printf("%d ", values[n]); } qsort(values, 5, sizeof(int), cmpfunc); printf("n排序之后的列表:n"); for( n = 0 ; n < 5; n++ ) { printf("%d ", values[n]); } return(0); } ----------------------------- 6)system()函数
#includeint _cdecl system(const char *); //调用常用的DOS命令 参考文章:https://www.cnblogs.com/gaoquanning/p/3267268.html 7)随机数生成
生成随机函数三步骤: #include//到入头文件 srand((unsigned int)time(NULL)) void srand(unsigned int seed); //seed:这是一个整型数,用于伪随机数生成算法播种 //无返回值 time(NULL); //获取系统时间,单位为秒 rand() //生成随机数 8)exec()系列函数和system()函数
#includeint system(const char *str);



