c语言常见字符函数、内存函数(详讲)

前言:

其实在c语言当中是没有字符串这一概念的,不像c++里面有string类型用来存放字符串。在c语言中我们只能把字符串放在字符串常量以及字符数组中。

1.常见字符串函数

1.1strlen

size_t strlen ( const char * str );

作用:用来求字符串中 '\0' 前面出现的字符个数(不包 含 '\0' )。

这里我们要注意的是,在定义字符数组的时候,我们需要给‘\0’留出空间,因为编译器会在字符串后面加一个‘\0’。

#include<stdio.h>
#include<string.h>
int main() {char arr[5] = "asdfg";printf("%zd\n", strlen(arr));return 0;
}

我们可以看到,如果我们没有手动在字符串后面加一个‘\0',并且还没有预留出一个位置用来编译器自动放‘\0'的时候,strlen在计算字符串大小的时候就会出错。

所以在使用strlen的时候,我们要注意字符串末尾是否有‘\0',要么是自己手动添加,要么是留出位置(空间)给编译器自动添加。

当然这种不初始化空间大小方式也可以:(编译器会自动给留出空间放’\0')

char arr[] = "asdfg";
printf("%zd\n", strlen(arr));

还需要注意的是strlen函数的返回值类型,是size_t而不是int.

size_t和int有什么区别呢?

size_t是无符号整数,也就意味着没有负数这一概念.

1.2.strcpy

char* strcpy(char * destination, const char * source );

这个是字符串复制函数,将source指向地址的字符覆盖destination指针指向的地址的元素,以source字符串的‘\0'结束。

要注意的是:

1.目标字符串的空间一定要足够。

2.源字符串一定以’\0'结尾。

3.会将源字符串中的 '\0' 拷贝到目标空间

1.3.strcat

char * strcat ( char * destination, const char * source );

字符串追加函数,用来在目标字符串后面接上源字符串

通俗的来说就是达到“abc"+"def"="abcdef"这一目的。

注意:

1.源字符串必须以 '\0' 结束。

2.目标空间必须有足够的大,能容纳下源字符串的内容。

3.目标空间必须可修改。

4.字符串不可以自己给自己追加。

为什么不可以自己给自己追加呢?

首先我们要知道,strcat函数追加的原理是在目标字符串的‘\0'处开始追加,直到源字符串的’\0'被追加过去后马上停止。也就意味着,如果是自己追加自己,在开始追加的时候就把目标字符串的‘\0’给覆盖了,由于目标字符串和源字符串是一个东西,所以发现源字符串的’\0‘找不到了。所以就会出错。

1.4.strcmp

int strcmp ( const char * str1, const char * str2 )

字符串比较函数:标准规定, 第一个字符串大于第二个字符串,则返回大于0的数字 第一个字符串等于第二个字符串,则返回0 第一个字符串小于第二个字符串,则返回小于0的数字。

那如何比较呢?

其实就是从第一个字符串开始,比较字典序大小,遇到不一样的就停止。

const char* str1 = "abcdef";
const char* str2 = "abc";const char* str3 = "abcdef";
const char* str4 = "abd";const char* str5 = "abc";
const char* str6 = "abc";
printf("%d\n", strcmp(str1, str2));
printf("%d\n", strcmp(str3, str4));

以上都是我们比较常用的一些字符串函数,下面来介绍一些升级版的字符串函数。

1.5.strncmp

char * strncpy ( char * destination, const char * source, size_t num );

我们发现它跟strcmp函数很像,而且同样也是实现字符串的比较功能,但是strncmp可以控制比较的长度,第三个参数表示只比较前num个字符的大小。

const char* str1 = "abcdef";
const char* str2 = "abc";
printf("%d\n", strncmp(str1, str2,3));

1.6.strncat

char * strncat ( char * destination, const char * source, size_t num );

跟strcat函数很像,而且同样也是实现字符串的追加功能,但是前者可以控制追加的长度,第三个参数表示只追加源字符串前num个字符。

char arr1[20] = "xxxxxxxxx";
char arr2[5] = "asdff";
printf("%s\n", strncat(arr1, arr2,2));

1.7.strncpy

拷贝num个字符从源字符串到目标空间。如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。

1.8.strstr

char * strstr ( const char *str1, const char * str2);

查找字符串str1里面有没有出现str2所指字符串,如果有返回首次出现的位置。

#include <stdio.h>
#include <string.h>
int main ()
{char str[] ="This is a simple string";char * pch;pch = strstr (str,"simple");strncpy (pch,"sample",6);puts (str);return 0;
} 

1.9.strtok

char * strtok ( char * str, const char * sep );

这个函数大家见的可能比较少,这是分割函数。

就是将一个字符串按照一个分割符集合去分割成各个部分。

1.sep参数是个字符串,定义了用作分隔符的字符集合 。

2.第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标 记。

3.strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容 并且可修改。)

4.strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串 中的位置。

5.strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标 记。

6.如果字符串中不存在更多的标记,则返回 NULL 指针。

使用strtok将字符串分割:

  char str[] ="- This, a sample string.";char * pch;printf ("Splitting string \"%s\" into tokens:\n",str);pch = strtok (str," ,.-");while (pch != NULL){printf ("%s\n",pch);pch = strtok (NULL, " ,.-");}

  char *p = "zhangpengwei@bitedu.tech";const char* sep = ".@";char arr[30];char *str = NULL;strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容for(str=strtok(arr, sep); str != NULL; str=strtok(NULL, sep)){printf("%s\n", str);}

strtok 函数会返回分割后的子字符串的指针,如果没有可分割的字符串,返回 NULL。请注意,在每次调用 strtok 函数时,第一个参数传入 NULL,以便获取剩余的分割字符串。

2.常见内存函数

什么叫内存函数?

内存函数是指在 C 语言中用来操作内存的一组函数。这些函数允许开发者对内存进行分配、拷贝、比较和设置等操作,以满足程序的需求。

常见的内存函数包括:

  1. malloc:用于动态分配指定大小的内存空间。
  2. calloc:用于动态分配指定数量和大小的内存空间,并将分配的内存初始化为零。
  3. realloc:用于重新调整之前动态分配的内存空间的大小。
  4. free:用于释放之前动态分配的内存空间。
  5. memcpy:用于将源内存区域的内容复制到目标内存区域。
  6. memcmp:用于比较两个内存区域的内容是否相同。
  7. memset:用于将指定内存区域的内容设置为指定的值。
  8. memmove:用于在内存中移动一块数据的内容。

这里我只讲后面几个。

2.1.memcpy

void * memcpy ( void * destination, const void * source, size_t num );

函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。 这个函数在遇到 '\0' 的时候并不会停下来。 如果source和destination有任何的重叠,复制的结果都是未定义的。

不同于strcpy,memcpy可以复制任何类型的数据。

#include <stdio.h>
#include <string.h>
struct {char name[40];int age;
} person, person_copy;
int main ()
{char myname[] = "Pierre de Fermat";/* using memcpy to copy string: */memcpy ( person.name, myname, strlen(myname)+1 );person.age = 46;/* using memcpy to copy structure: */memcpy ( &person_copy, &person, sizeof(person) );printf ("person_copy: %s, %d \n", person_copy.name, person_copy.age );return 0;
}

2.2.memmove

memmove 是一个 C 语言库函数,用于在内存中移动一块数据的内容。它的函数原型如下:

void *memmove(void *dest, const void *src, size_t n);

1.dest 是目标内存区域的指针,数据将被复制到此处。

2.src 是源内存区域的指针,要复制的数据来自此处。

3.n 是要复制的字节数。

memmove 函数将源内存区域中的数据复制到目标内存区域。与 memcpy 不同的是,memmove 函数可处理源和目标内存区域重叠的情况,确保数据被正确复制。

#include <stdio.h>
#include <string.h>int main() {char str[10] = "Hello";// 使用 memmove 将字符 'o' 移动到字符串开头memmove(str, str+4, 2);printf("%s\n", str);  // 输出结果: "oHell"return 0;
}

2.3.memcmp

内存比较函数,比较从ptr1和ptr2指针开始的num个字节,在num个字节之前遇到不相等的就停下,返回值和strcmp一致。

int memcmp ( const void * ptr1,const void * ptr2,size_t num );
 char buffer1[] = "DWgaOtP12df0";char buffer2[] = "DWGAOTP12DF0";int n;n=memcmp ( buffer1, buffer2, sizeof(buffer1) );if (n>0) printf ("'%s' is greater than '%s'.\n",buffer1,buffer2);else if (n<0) printf ("'%s' is less than '%s'.\n",buffer1,buffer2);else printf ("'%s' is the same as '%s'.\n",buffer1,buffer2);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/88094.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言 L1-016 查验身份证

L1-016 查验身份证 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下&#xff1a; 首先对前17位数字加权求和&#xff0c;权重分配为&#xff1a;{7&#xff0c;9&#xff0c;10&#xff0c;5&#xff0c;8&#xff0c;4&#xff0c…

【MySQL】基础实战篇(1)—数据库与数据表的操作

创建管理数据库创建数据库查看与选择数据库修改数据库删除数据库 创建管理数据表创建数据表查看数据修改数据表删除数据表 创建管理数据库 创建数据库 语法&#xff1a; CREATE DATABASE 数据库名称;注&#xff1a; 在同一个数据库服务器上必须是唯一的&#xff0c;不允许存…

c++模版元编程,基于递归的编程

基于递归的模版元编程允许在模版中进行递归调用&#xff0c;以便在编译时生成更复杂的代码。这种技术的核心思想是将问题分解为一个个较小的子问题&#xff0c;并通过递归地调用模版来处理它们。 模版元编程的基本概念和原理&#xff1a; 模版元编程是一种利用C模版系统在编译时…

人工智能的未来:从 Jetson 到 GPT,沙龙见闻与洞察

前言 在当今数字化时代&#xff0c;人工智能正以惊人的速度改变着我们的生活和工作方式。从智能语音助手到自动驾驶汽车&#xff0c;从智能家居到医疗诊断&#xff0c;人工智能技术已经广泛渗透到各个行业&#xff0c;并为其带来了巨大的变革和创新。越来越多的行业专家、学者…

postman发送图片

POSTMAN 如何发送携带图片的请求? 闲话不叙 步骤如下&#xff1a; 新建一个请求&#xff0c;在Headers中添加一对k-v : Content-Type > multipart/form-data 请求的接口: RequestMapping("/fileUploadController")public String fileUpload(MultipartFile fil…

【C++】构造函数和析构函数第一部分(构造函数和析构函数的作用)--- 2023.9.25

目录 前言初始化和清理的概念构造函数和析构函数的作用构造函数的作用析构函数的作用 使用构造函数和析构函数的注意事项默认的构造函数和析构函数结束语 前言 在使用c语言开发的项目场景中&#xff0c;我们往往会遇到申请空间的需求&#xff0c;同时也肯定遇到过程序运行一段…

蓝牙核心规范(V5.4)10.9-BLE 入门笔记之GAP

1.概述 蓝牙核心规范的通用访问配置文件(GAP)部分定义了与设备发现和在两个设备之间建立连接有关的过程。如何执行数据的基本无连接通信、如何使用周期性广播(参见 PADVB-LE Periodic Advertising Broadcast)以及如何设置等时通信(参见 LE BIS和LE CIS - Isochronous Com…

购物车案例

1功能模块分析 请求动态渲染购物车&#xff0c;数据存vuex 数据框控件 修改数据 动态计算总价和总数量 2脚手架新建项目 终端安装axios&#xff1a;npm install axios -g 基于json-server工具&#xff0c;准备后端接口服务环境:&#xff08;模拟后台假数据&#xff09; 1…

积跬步致千里 || 可视化动图展示

可视化动图展示 目前只能在 jupyter notebook 中测试成功 %matplotlib notebook import numpy as np import matplotlib.pyplot as plt import timen 500 data np.random.normal(0,1,n)fig plt.figure() ax fig.add_subplot(111)fig.show() fig.canvas.draw()for i in ra…

互联网摸鱼日报(2023-09-25)

互联网摸鱼日报(2023-09-25) 36氪新闻 WPS AI开放邀请体验&#xff0c;打工人办公的最强福音来了 万亿早餐赛道&#xff0c;谁能笑到最后&#xff1f; 所谓能力问题&#xff0c;80%都是态度问题 本周双碳大事&#xff1a;首批CCER方法学或开放四类项目&#xff1b;隆基绿能…

什么是Redux?它的核心概念有哪些?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 什么是Redux&#xff1f;⭐ 它的核心概念有哪些&#xff1f;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发…

C++——模板

目录 泛型编程 函数模板 函数模板概念 函数模板格式 类模板 类模板的定义格式 类模板的实例化 泛型编程 泛型编程是什么呢&#xff1f;泛型编程&#xff1a;编写与类型无关的通用代码&#xff0c;是代码复用的一种手段。模板是泛型编程的基础。型就是类型&#xff0c;不…

【Java】医院智能导诊小程序源码,springboot框架

智能导诊 可以根据用户症状描述精准推荐科室及医生智能学习医院历史数据及自动进行科室对照,与医院的系统连接后,患者可直接完成预约。 一、系统概述 “智能导诊”以人工智能手段为依托&#xff0c;为人们提供智能分诊、问病信息等服务&#xff0c;在一定程度上满足了人们自我…

低照度增强算法(图像增强+目标检测+代码)

本文介绍 在增强低光图像时&#xff0c;许多深度学习算法基于Retinex理论。然而&#xff0c;Retinex模型并没有考虑到暗部隐藏的损坏或者由光照过程引入的影响。此外&#xff0c;这些方法通常需要繁琐的多阶段训练流程&#xff0c;并依赖于卷积神经网络&#xff0c;在捕捉长距…

python+vue驾校驾驶理论考试模拟系统

管理员的主要功能有&#xff1a; 1.管理员输入账户登陆后台 2.个人中心&#xff1a;管理员修改密码和账户信息 3.用户管理&#xff1a;管理员可以对用户信息进行添加&#xff0c;修改&#xff0c;删除&#xff0c;查询 4.添加选择题&#xff1a;管理员可以添加选择题目&#xf…

ElementUI首页导航和左侧菜单静态页面的实现,以及Mockjs和总线的介绍

目录 前言 一. Mock.js 1.1 什么是Mock.js 1.2 Mockjs的安装与配置 1.2.1 安装Mock.js 1.2.2 引入Mock.js 1.3 Mockjs的使用 1.3.1 定义数据测试文件 1.3.2 mock拦截ajax请求 二. 首页导航以及左侧菜单的搭建 2.1 什么是总线 2.2 创建三个vue组件 首页AppMain.vue组…

QT 6.5下载安装及配置教程

一、下载 今天打算换一个QT安装版本,去官网看了一眼发现变成了在线安装。 本来官方下载的就慢,现在更是雪上加霜,现在给大家推荐几种下载方式。 1、国内镜像 中国科学技术大学&#xff1a;http://mirrors.ustc.edu.cn/qtproject/ 清华大学&#xff1a;https://mirrors.tuna.ts…

Ubuntu部署nginx

一、 下载nginx相关依赖包 apt-get install gccapt-get install libpcre3 libpcre3-devapt-get install zlib1g zlib1g-devsudo apt-get install opensslsudo apt-get install libssl-dev二、新建nginx的安装目录 cd /optmkdir nginxcd nginx三、通过wget下载nginx安装包 wg…

2024快手校招面试真题汇总及其解答(一)

1.spring springmvc springboot区别 Spring、Spring MVC 和 Spring Boot 都是 Java 框架,它们之间存在一定的联系和区别。 Spring 是 Java 的一个开源框架,它提供了一系列的模块,用于简化 Java 应用程序的开发。Spring 的核心模块是 IoC 容器和 AOP 框架,它们可以帮助开发…

SpringBatch ItemProcessor详解

ItemProcessor 在Spring Batch中用于对每个读取的数据项&#xff08;item&#xff09;进行处理或转换。 一、ItemProcessor 具体功能 数据清洗&#xff08;Data Cleansing&#xff09;&#xff1a;清理数据以确保数据的一致性和准确性。这可以包括去除不必要的空格、特殊字符、…