OutMan——C语言中字符串处理函数、内存管理和内存分区

来源:互联网 发布:中国传统价值观 知乎 编辑:程序博客网 时间:2024/05/18 19:44

字符串处理函数

一、字符串输出函数puts( )
格式:puts(字符数组名);
这里写图片描述
注意事项:
1. 使用该函数必须要引入头文件#include <stdio.h>
2. puts( )函数输出会自动换行
3. 传入puts函数中的可以不是数组名(数组的首地址),可以是数组元素的地址
4. 必须是字符数组
5. puts( )函数不可以经行格式化输出

二、字符串输出函数gets( )
格式:
char str[100];
gets(str)

char str[100];// 接收用户输入的字符串方式一scanf("%s", str);// 接收用户输入的字符串方式二gets(str);

注意事项:
1. 使用该函数必须要引入头文件#include <stdio.h>
2. scanf(“%s”, str);这种方式来接收用户输入的字符串有缺陷,输入字符串的时候不能接受空格(空格之后的字符都不会被接受)
这里写图片描述
3. 使用gets( )函数会给出一个警告warning: this program uses gets(), which is unsafe.
4. gets( )函数不安全的原因:数组长度为100,但是你输入120个字符,会有20个字符存在越界问题,它不会检测越界问题,所以是不安全的(存在越界问题)
5. 使用gets( )函数接收用户输入的时候,用户可以输入空格(gets( )函数可以接收空格)
这里写图片描述

三、字符串连接函数strcat( )
格式:strcat(oldStr, newStr);
这里写图片描述
注意事项:
1. 使用该函数必须要引入头文件#include <string.h>
2. oldStr的长度要大,至少要能保存的下oldStr+newStr
3. 使用字符串连接函数后,newStr把oldStr的最后一个字符‘\0’给覆盖了,将其拼接到oldStr字符串后面

四、字符串拷贝函数strcpy( )
格式:strcpy(str, str2);
这里写图片描述
注意事项:
1. 使用该函数必须要引入头文件#include <string.h>
2. 将str2拷贝在str中,str会被覆盖
3. str要足够大,否则可能会越界,至少要存储的下str2

五、字符串比较函数strcmp( )
格式:cmp(str, str2);
这里写图片描述
1. 使用该函数必须要引入头文件#include <string.h>
2. 比较大小规则:比较对应位置字符的ASCII码值(比较对应位置字符在字典中出现的顺序,先出现的小,后出现的大)
3. 比较过程:逐个取出两个字符串中对应位置的字符相比较,从第一位不相同的两个字符就可以确定两个字符串的大小
4. strcmp( )函数有返回值
<1> 返回值大于0 说明 str > str2
<2> 返回值小于0 说明 str < str2
<3> 返回值等于0 说明 str == str2
5. 返回值就是两个字符串中,第一位不相同的两个字符ASCII码的差值

六、计算字符串长度的函数strlen( )
格式:strlen(str);
这里写图片描述
注意事项:
1. 使用该函数必须要引入头文件#include <string.h>
2. strlen( )函数计算的是字符数,并不是字数(1个汉字占3个字节(3个字符))
3. 计算的字符不包括’\0’
4. 从某个地址开始计算字符的个数,直到遇到’\0’为止

fgets( )和fputs( )函数使用

一、fgets( )的使用
1. fgets( )函数是一个文件操作相关的函数,这里介绍使用这个函数从键盘上接收一个字符串,保存到数组中
2. 原来接收字符串保存到数组中的方法:
<1> 方式一:

char str[50];scanf("%s", str);

缺点:不能接收空格

<2> 方式二:

char str[50];gets(str);

优点:可以接收空格
缺点:会有警告,不安全(存在越界问题)
3. fgets( )函数是一个安全的字符串接收函数
格式:fputs(数组名,数组长度,stdin);
这里写图片描述
这里写图片描述
4. 当输入的字符串的长度大于数组的长度,此时fgets( )函数会自动的将数组的最后一个元素变为’\0’
这里写图片描述
5. 当输入的字符串的长度小于数组的长度的时候,fgets( )函数还会接收回车
这里写图片描述

二、fputs( )函数的使用
1. fputs( )函数是一个文件操作相关的函数
2. 格式:fputs(数组名,stdout);
这里写图片描述
3. fputs( )函数不能自动换行,也不能经行格式化输出
4. puts( )函数可以自动换行

三、fgets( )和fputs( )的优缺点
        fgets( )和fputs( )最大的优点是帮我们自动截取输入的字符串,使得我们对字符串的存取是安全的(不会存在越界访问的问题)

内存管理和内存分区

一、内存管理的概念
        内存管理:是指软件运行时对计算机内存资源的分配和使用技术,其主要的目的是如何高效、快捷的分配内存,并且在适当的时候释放和回收内存资源

二、内存的分配方式
1. 从静态存储区分配(内存在程序编译的时候就已经分配好了)
2. 从栈上创建
3. 从堆上分配

三、内存分区
这里写图片描述
1. 栈(堆栈、stack):是用来存放程序临时创建的局部变量
2. 堆(heap):用来存放程序运行中被动态分配的内存段
3. BSS段:通常用来存放程序中未初始化的全局变量和静态变量
4. 数据段(常量区):通常用来存放程序中已经初始化的全部变量、静态变量和字符串常量
5. 代码段:用来存放程序执行代码的一块内存区域

四、常见的内存分配函数
        内存管理,管理的是用户自己申请的空间,C语言中提供了三个动态分配内存的函数:malloc( )、calloc( )和realloc( )

(1)malloc( )函数
1. 包含在库函数stdlib.h中
2. 它的使用方法void *malloc(size_t size);其中size是指分配内存的字节(size_t类型就是unsigned类型)
3. 作用:从内存的堆区分配大小为size个字节的连续内存空间,如果内存分配成功,返回内存空间的首地址,如果内存分配失败,返回NULL
4. malloc( )函数使用的代码实现
这里写图片描述
使用注意:
        malloc( )函数申请的空间,如果我们不赋值,里面会是垃圾数,如何给使用malloc( )函数申请的空间经行初始化(使用memset( )函数)
这里写图片描述

(2)calloc( )函数
1. 包含在库函数stdlib.h中
2. 它的使用方法void *calloc(size_t count, size_t size);其中count是指分配内存的块数,size是指分配内存的字节(size_t类型就是unsigned类型)
3. 作用:从内存的堆区分配count块,每块大小为size个字节的连续内存空间,如果内存分配成功,返回内存空间的首地址,如果内存分配失败,返回NULL
4. calloc( )函数使用的代码实现
这里写图片描述
使用注意:
        calloc( )函数申请的内存空间,会自动帮我们将其中的内容初始化为0

(3)realloc( )函数
1. 包含在库函数stdlib.h中
2. 它的使用方法:void *realloc(void *ptr, size_t size);其中ptr传地址,size是指分配内存的字节(size_t类型就是unsigned类型)
3. 作用:给ptr指向的空间扩充size个字节,如果内存分配成功,返回内存空间的首地址(有可能返回一个新的内存空间地址),如果内存分配失败,返回NULL
4. realloc( )函数使用的代码实现
这里写图片描述
使用注意:
        realloc( )函数有可能会返回一个新的内存空间地址

五、野指针和内存泄露
(1)内存泄露

int main(){    // 这段代码会造出内存泄露    int *p = malloc(4 * sizeof(int));    return 0;}

        分析:当函数执行完,局部变量指针变量被销毁p被销毁了,但是malloc(4 * sizeof(int))申请的内存空间依然还在,所以会造成内存泄露
        解决办法:在释放p之前,先释放堆区中的内存空间,使用free( )函数来释放内存空间

int main(){    // 这段代码会造出内存泄露    int *p = malloc(4 * sizeof(int));    // 应当在指针变量p被销毁之前,先释放堆区中的内存空间    // 使用free()函数来释放内存空间    // free(要释放的空间的首地址)    free(p);    // free(p)之后,p是个野指针    p = NULL;    return 0;}

注意事项:
1. 在释放p之前,先释放堆区中的内存空间,使用free( )函数来释放内存空间
2. free(p)之后,p是个野指针,这时一定要清空指针( p = NULL )

(2)野指针
        指针变量如果不进行初始化,里面会有一个垃圾值,这时候我们称这是个野指针,如果操作一个野指针:
1. 可能会导致程序崩溃
2. 访问了你不该访问的数据


                                        —— 如果您有不同的见解,请随时指出,期待与您的交流!——


0 0
原创粉丝点击