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,一经查实,立即删除!

相关文章

人工智能的未来:从 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;同时也肯定遇到过程序运行一段…

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

可视化动图展示 目前只能在 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…

什么是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…

电压放大器在超声成像中的工作原理和应用

在超声成像中&#xff0c;电压放大器是一种重要的仪器&#xff0c;主要用于放大从探头传来的微弱信号&#xff0c;并将其转换为可以处理和显示的电信号。下面安泰电子将详细介绍电压放大器在超声成像中的工作原理和应用。 图&#xff1a;超声成像 工作原理 在超声成像中&#x…

第二届全国高校计算机技能竞赛——Java赛道

第二届全国高校计算机技能竞赛——Java赛道 小赛跳高 签到题 import java.util.*; public class Main{public static void main(String []args) {Scanner sc new Scanner(System.in);double n sc.nextDouble();for(int i 0; i < 4; i) {n n * 0.9;}System.out.printf(&…

【深度学习实验】前馈神经网络(一):使用PyTorch构建神经网络的基本步骤

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入库 1. 定义x,w,b 2. 计算净活性值z 3. 实例化线性层并进行前向传播 4. 打印结果 5. 代码整合 一、实验介绍 本实验使用了PyTorch库来构建和操作神经网络模型&#xff0c;主要是关…

18672-2014 枸杞 学习记录

声明 本文是学习GB-T 18672-2014 枸杞. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了枸杞的质量要求、试验方法、检验规则、标志、包装、运输和贮存。 本标准适用于经干燥加工制成的各品种的枸杞成熟果实。 2 规范性引用文件…

时序预测 | MATLAB实现POA-CNN-BiGRU鹈鹕算法优化卷积双向门控循环单元时间序列预测

时序预测 | MATLAB实现POA-CNN-BiGRU鹈鹕算法优化卷积双向门控循环单元时间序列预测 目录 时序预测 | MATLAB实现POA-CNN-BiGRU鹈鹕算法优化卷积双向门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现POA-CNN-BiGRU鹈鹕算法优化卷积双向…

【Pycharm/Anaconda配置环境记录】

文章目录 1、Pytorch配置2、mmcv配置 1、Pytorch配置 查看虚拟环境创建虚拟环境 conda env list&#xff1a;查看虚拟环境 conda create --name env_name python3.7&#xff1a;创建虚拟环境 conda activate env_name&#xff1a;激活/进入该虚拟环境 查看自己的CUDA版本以及P…

田忌赛马Java

给定两个大小相等的数组 A 和 B&#xff0c;A 相对于 B 的优势可以用满足 Ai] > Bi] 的索的数目来描述。 返回 A的任意排列&#xff0c;使其相对于 B 的优势最大化. 其实核心思想就是让A中的数最小且刚好大于B中数,我们可以用链表来存储A和B中对应的数据,至于B比A中所有的数…

DragGesture/拖动手势 的使用

1. DragGesture 拖动手势操作 1.1 实现 /// 拖动手势 struct DragGestureBootcamp: View {State var offset: CGSize .zerovar body: some View {//dragGesture1dragGesture2}/// 方式二var dragGesture2: some View{ZStack {VStack {Text("\(offset.width)")Space…

【算法练习Day5】有效的字母异位词 两个数组的交集快乐数两数之和

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 有效的字母异位词两个数…