C语言常用的库函数
printf和scanf就不说了
字符串输出函数:puts
/* 格式: puts(字符数组名) 功能:把字符数组中的字符串输出到显示器。 即在屏幕上显示该字符串。 从程序中可以看出puts函数中可以使用转义字符,因此输出结果成为两行。puts函数完全可以由 printf函数取代。当需要按一定格式输出时,通常使用printf函数。 */ #include <stdio.h> int main(int argc, const char * argv[]) { char str[]="中文中文中文中文中文中文中文\n"; puts(str); return 0; }
字符串输入函数:gets
/* 格式: gets (字符数组名) 功能:从标准输入设备键盘上输入一个字符串。 本函数得到一个函数值,即为该字符数组的首地址。 可以看出当输入的字符串中含有空格时,输出仍为全部字符串。说明gets函数并不以空格作为字 符串输入结束的标志,而只以回车作为输入结束。这是与scanf函数不同的。 */ #include <stdio.h> int main(int argc, const char * argv[]) { char str[30]; gets(str); puts(str); return 0; }
字符串连接函数:strcat
/* 格式: strcat(字符数组名1,字符数组名2) 功能:把字符数组2中的字符串连接到字符数组1 中字符串的后面,并删去字符串1后的串标志 “\0”。本函数返回值是字符数组1的首地址。 本程序把初始化赋值的字符数组与动态赋值的字符串连接起来。要注意的是,字符数组1应定义足 够的长度,否则不能全部装入被连接的字符串。 */ #include <stdio.h> int main(int argc, const char * argv[]) { char str1[200]="str1"; char str2[10]; gets(str2); strcat(str1,str2); puts(str1); return 0; }
字符串拷贝函数:strcpy
/* 格式: strcpy(字符数组名1,字符数组名2) 功能:把字符数组2中的字符串拷贝到字符数组1中。串结束标志“\0”也一同拷贝。字符数名2, 也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。 本函数要求字符数组1应有足够的长度,否则不能全部装入所拷贝的字符串。 */ #include <stdio.h> int main(int argc, const char * argv[]) { char str1[]="str1111"; char str2[]="str2222"; strcpy(str1, str2); puts(str1); return 0; }
字符串比较函数:strcmp
/* 格式: strcmp(字符数组名1,字符数组名2) 功能:按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。 字符串1=字符串2,返回值=0; 字符串1>字符串2,返回值>0; 字符串1<字符串2,返回值<0。 本函数也可用于比较两个字符串常量,或比较数组和字符串常量。 */ #include <stdio.h> #include <string.h> int main(int argc, const char * argv[]) { char str1[]="abce"; char str2[]="abcd"; int result = strcmp(str1, str2); printf("%d\n",result); return 0; }
测字符串长度函数:strlen
/* 格式: strlen(字符数组名) 功能:测字符串的实际长度(不含字符串结束标志‘\0’)并作为函数返回值。 */ #include <stdio.h> #include <string.h> int main(int argc, const char * argv[]) { char str[]="a"; long int result = strlen(str); printf("%ld\n",result); return 0; }
fgets()函数
/* fgets的原型是 char* fgets(char* s, int n, FILE* fp); 参数数量比较多,有3个。而fgets相比于gets有一个显著的差别就是fgets会将行末的换行符算到 读入的字符串里面。所以相同且正常(输入无错误,缓冲区够大)的情况下,fgets读入的字符串 会比gets在末尾'\0'前面多一行符;行长度超出缓冲区大小时只读入前 n-1 个字符。 因此, gets(s); 相当于 fgets(s, sizeof(s), stdin); */ /* fgets()、fputs()最大的优点是帮我们自动截取输入的字符串,使得我们对字符串的存取是安全 的 */ #include <stdio.h> int main(int argc, const char * argv[]) { char str[5]; fgets(str, sizeof(str), stdin); puts(str); return 0; }
fputs()函数
/* fputs(将一指定的字符串写入文件内) 相关函数 fopen,fwrite,fscanf,fputc,putc 表头文件 #include<stdio.h> 定义函数 int fputs(const char * s,FILE * stream); 函数说明 fputs()用来将参数s所指的字符串写入到参数stream所指的文件内。 返回值 若成功则返回写出的字符个数,返回EOF则表示有错误发生。 fputs(names, stdout); 1) 输出到控制台 2) 不会换行的 */ /* fgets()、fputs()最大的优点是帮我们自动截取输入的字符串,使得我们对字符串的存取是安全 的 */ #include <stdio.h> int main(int argc, const char * argv[]) { char str[5]; fgets(str, sizeof(str), stdin); fputs(str, stdout); return 0; }
动态内存分配函数
/* C语言中提供了3个动态内存分配函数: 1)malloc 函数 格式: void * malloc(unsigned size); 从内存的堆区分配大小为size个字节的连续的内存空间 如果内存分配成功 返回内存的首地址 失败 NULL */ #include <stdio.h> #include <stdlib.h> #include <string.h> /** * malloc函数的使用 */ void test1(){ //从内存中申请一块内存空间,可以存储4个整数 // = 赋值,要求等号的左右两侧的类型要一致 //p中存放的事新申请的内存空间的首地址 //注意:malloc 申请的内存空间,如果我们不赋值? // 是垃圾数 int *p = (int *)malloc(4*sizeof(int)); //16个字节 //使用一个函数给malloc申请的空间进行初始化 memset(p,'a',16); if (p!=NULL) { //申请成功做的事情 // *p = 10; // *(p+1) = 100; // *(p+2) = 1000; // *(p+3) = 10000; //存放4个整数 }else{ //内存申请失败 printf("内存申请失败!\n"); } for(int i=0;i<4 ;i++){ printf("%c\t",*(p+i)); } } void test2(){ malloc(100); //callloc 分配指定块数和长度的内存空间 //格式:calloc(块数,长度) //分配了4块,每一块内存长度为4的内存空间 //他们的地址也是连续的 //注意事项: //calloc 它使可以帮我们自动的初始化为0 int *p = (int *)calloc(4, sizeof(int)); //16个字节 if (p!=NULL) { //申请成功做的事情 *p = 10; *(p+1) = 100; *(p+2) = 1000; *(p+3) = 10000; //存放4个整数 }else{ //内存申请失败 printf("内存申请失败!\n"); } for(int i=0;i<4 ;i++){ printf("%d\t",*(p+i)); } } int main(int argc, const char * argv[]) { int *p = (int *)malloc(4*sizeof(int)); //16个字节 printf("old %p\n",p); //realloc 函数可以给已经存在的空间扩充大小 p = realloc(p, 40*sizeof(int)); printf("new %p\n",p); //40个内存空间 if (p!=NULL) { //申请成功做的事情 *p = 10; *(p+1) = 100; *(p+2) = 1000; *(p+3) = 10000; //存放4个整数 *(p+39)= 1; printf("%d\n",*(p+39)); }else{ //内存申请失败 printf("内存申请失败!\n"); } for(int i=0;i<4 ;i++){ printf("%d\t",*(p+i)); } return 0; }
free函数
/* 野指针和内存泄露,free函数使用 注意:free(p) 后,一定要再把 p 赋值为 NULL free(p); p = NULL; */ #include <stdio.h> #include <stdlib.h> int main(int argc, const char * argv[]) { int *p = (int *)malloc(4*sizeof(int)); //16个字节 if (p!=NULL) { //申请成功做的事情 *p = 10; *(p+1) = 100; *(p+2) = 1000; *(p+3) = 10000; //存放4个整数 }else{ //内存申请失败 printf("内存申请失败!\n"); } //应该使用free()函数释放内存空间 //free(要释放的空间的首地址) printf("释放前 %p\n",p); // free(p); // 补充: 代表的是p指向那块空间可以被重新利用 //free(p)以后,p是一个野指针 // p = NULL; // *p = 100; // 补充: int *p2 = (int *)malloc(4*sizeof(int)); printf("释放后 %p\n",p); printf("p2地址: %p",p2); return 0; }