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;
}

 

posted @ 2015-12-24 23:25  iospp  阅读(703)  评论(0编辑  收藏  举报