当前位置: 首页 > news >正文

【C语言】字符/字符串+内存函数

目录

Ⅰ、字符函数和字符串函数

        1 .strlen

        2.strcpy

        3.strcat

        4.strcmp

        5.strncpy

        6.strncat

        7.strncmp

        8.strstr

        9.strtok

        10.strerror

        11.字符函数 

        12. 字符转换函数

Ⅱ、内存函数

         1 .memcpy

        2.memmove

        3.memcmp


Ⅰ、字符函数和字符串函数

        1 .strlen

函数原型:

注意事项:

1.字符串以  '\0' 作为结束标志 strlen 函数返回的是在字符串中 '\0' 前面 出现的字符个数( 不包含 '\0' )
2.参数指向的字符串 必须要以 '\0' 结束
3.注意函数的 返回值 size_t ,是无符号的( 易错
4.学会 strlen 函数的模拟实现

模拟实现:三种方法(计数器,递归,指针-指针

//模拟实现strlen
//方法一:计数器
size_t my_strlen1(const char* str)
{char* st = str;size_t count = 0;while (*st++){count++;}return count;
}
//方法二:递归
size_t my_strlen2(const char* str)
{if (*str == '\0')return 0;return 1 + my_strlen2(++str);//注意这里不能用   后置++
}
//方法三:指针-指针
size_t my_strlen3(const char* str)
{char* st = str;while (*st != '\0'){//printf("%p\n", str);//  从小地址往大地址编址st++;}return st-str;
}

        2.strcpy

函数原型:

注意事项:

1.Copies the C string pointed by source into the array pointed by destination, including the
terminating null character (and stopping at that point).
2.源字符串 必须以 '\0' 结束
3.会将 源字符串 中的 '\0' 拷贝到 目标空间
4.目标 空间必须足够大 ,以确保能存放源字符串。
5.目标 空间必须可变
6.学会模拟实现。

模拟实现:

//模拟实现strcpy
char* my_strcpy(char* dest, const char* src)
{assert(dest && src);char* cur = src; char *re = dest;while (*dest++ = *src++);return re;
}

        3.strcat

函数原型:

注意事项:

1.Appends a copy of the source string to the destination string. The terminating null character
in destination is overwritten by the first character of source, and a null-character is included
at the end of the new string formed by the concatenation of both in destination.
2.源字符串 必须以 '\0' 结束
3.目标 空间 必须有 足够 的大,能容纳下源字符串的内容。
4.目标空间必须 可修改
5.字符串自己给自己追加,如何?不能,可能会 非法访问

模拟实现:

//模拟实现strcat
char* my_strcat(char* dest, const char* src)
{assert(dest&&src);char* ret = dest;while (*dest != '\0')dest++;char* sr = src;while (*dest++ = *sr++);return ret;
}

        4.strcmp

函数原型:

注意事项:

1.This function starts comparing the first character of each string. If they are equal to each
other, it continues with the following pairs until the characters differ or until a terminating
null-character is reached.
标准规定:
1.第一个字符串大于第二个字符串,则返回 大于0 的数字
2.第一个字符串等于第二个字符串,则返回 0
3.第一个字符串小于第二个字符串,则返回 小于0 的数字

模拟实现:

//模拟实现strcmp
int my_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);while (*str1 == *str2){if (*str1 == '\0')return 0;str1++;str2++;}if (*str1 < *str2)return -1;elsereturn 1;
}

        5.strncpy

函数原型:

注意事项:

1.Copies the first num characters of source to destination. If the end of the source C string
(which is signaled by a null-character) is found before num characters have been copied,
destination is padded with zeros until a total of num characters have been written to it.
2.拷贝 num个字符 字符串到 目标空间
3.如果源字符串的长度 小于num ,则拷贝完源字符串之后,在目标的后边 追加0 ,直到 num

 简单使用;

//使用strncpy
int main()
{char buf[128] = "xxxxxxxxxxxxxxxxxxxxxxxxxxx";char* str = "abcdef";printf("%s\n", strncpy(buf, str,7 ));//没有超过就是n为多大就拷贝几个过去,//n如果超过了字符串的长度后面就进行补 '\0'return 0;
}

执行结果:

 

        6.strncat

函数原型:

注意事项:

1.Appends the first num characters of source to destination, plus a terminating null-character.
2.If the length of the C string in source is less than num, only the content up to the terminating null-character is copied
3.如果 空间 不够,要报错
4.如果num比源字符串长,则紧追加 NULL之前 的字符

简单使用:

//使用strncat
int main()
{char buf[128]="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";buf[10] = '\0';		//从第一个'\0'开始拼接buf[20] = '\0';char* str = "abcdef";printf("%s", strncat(buf, str, 5));return 0;
}

执行结果:

 

        7.strncmp

函数原型:

注意事项:

比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。

简单使用:

/* strncmp example */
int main()
{char str[][5] = { "R2D2" , "C3PO" , "R2A6" };int n;puts("Looking for R2 astromech droids...");for (n = 0; n < 3; n++)if (strncmp(str[n], "R2xx", 2) == 0){printf("found %s\n", str[n]);}return 0;
}

 执行结果:

        8.strstr

函数原型:

注意事项:

Returns a poin ter to the first occurrence of str2 in str1, or a null pointer if str2 is not part of
str1.

模拟实现:

//strstr的模拟实现
char* my_strstr(const char* str1, const char* str2)
{while (*str1){if (*str1 == *str2){char* s1 = str1; char* s2 = str2;while (*s1 && *s2 && (*s1 == *s2)){s1++;s2++;}if (*s2 == '\0')return str1;}str1++;}
}

        9.strtok

函数原型:

注意事项:

1.sep 参数是个字符串,定义了用作 分隔符的字符集合
2.第一个参数指定一个字符串,它包含了 0个或者多个由sep字符串中一个或者多个分隔符 分割的标记。
3.strtok 函数 找到str中的下一个标记 ,并将其用 \0 结尾 ,返回一个指向这个 标记的指针
(注strtok函数会 改变被操作的字符串 ,所以在使用 strtok 函数切分的字符串一般都是 临时拷贝的内容并且可修改 。)
4.strtok 函数的 第一个参数不为 NULL ,函数将找到 str 中第一个标记, strtok 函数将 保存它在字符串中的位置
5.strtok 函数的 第一个参数为 NULL ,函数将在同一个字符串中被 保存的位置开始 ,查找下一个标记。
6.如果字符串中 不存在更多的标记 ,则 返回 NULL 指针

简单使用:

//strtok使用
int main()
{char str[128] = "hyd@qwer.com.cn.edu.com";//注意这里必须是可修改的字符串,常量不能修改char* sep = "@.";char* ret = strtok(str, "@.");printf("%s\n", ret);while(ret=strtok(NULL,sep))printf("%s\n", ret);return 0;
}

执行结果:

 

        10.strerror

函数原型:

注意事项:

返回错误码(errno),所对应的错误信息。

简单使用:

//使用strerror
int main()
{FILE* fp = fopen("data.txt", "r");if (fp == NULL){//printf("打开失败:%s\n", strerror(errno));//打印错误信息perror("打开失败");//类似于 printf+错误原因}elseprintf("文件打开成功\n");return 0;
}

执行结果:

        11.字符函数 

函数 如果他的参数符合下列条件就返回真(非0)
iscntrl         任何控制字符(1-31是控制字符,32-127是可打印字符)
isspace      空白字符:空格‘ ’,换页 ‘\f’ ,换行 '\n' ,回车 ‘\r’ ,制表符 '\t' 或者垂直制表符 '\v'
isdigit         十进制数字 0~9
isxdigit       十六进制数字,包括所有十进制数字,小写字母a~f,大写字母 A~F
islower       小写字母a~z
isupper      大写字母A~Z
isalpha       字母a~z A~Z
isalnum      字母或者数字,a~z,A~Z,0~9
ispunct       标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraph       任何图形字符
isprint         任何可打印字符,包括图形字符和空白字符

        12. 字符转换函数

int tolower ( int c );
int toupper  ( int c );

简单使用:

/* isupper example */
#include <stdio.h>
#include <ctype.h>
int main ()
{int i=0;char str[]="Test String.\n";char c;while (str[i]){c=str[i];if (isupper(c)) c=tolower(c);putchar (c);i++;}return 0;
}

 执行结果:

Ⅱ、内存函数

         1 .memcpy

函数原型:

注意事项:

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

模拟实现:

//模拟实现memcpy
char* my_memcpy(void* dest, const void* src,size_t sz)
{assert(dest && src);char* ret = dest;while (sz--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}return ret;
}

        2.memmove

函数原型:

注意事项:

1.和 memcpy 的差别就是 memmove 函数处理的源内存块和目标内存块是可以重叠的。
2.如果源空间和目标空间出现重叠,就得使用 memmove 函数处理。

模拟实现:

//char* my_memmove(void* dest, const void* src, size_t sz)
{assert(dest && src);char* ret = (char*)dest;if (dest < src){while(sz--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}}else{while (sz--){*((char*)dest + sz) = *((char*)src + sz);}}
}

        3.memcmp

函数原型:

注意事项;

1.比较从 ptr1 ptr2 指针开始的 num 个字节
2.返回值如下:

简单使用:

int main()
{int arr1[] = { 1,2,3,4,5,6,7 };//01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00 06 00 00 00 07 00 00 00//int arr2[] = { 1,2,3,0x11223304 };//01 00 00 00 02 00 00 00 03 00 00 00 04 33 22 11int ret = memcmp(arr1, arr2, 13);printf("%d\n", ret);return 0;
}

执行结果:0 

相关文章:

【C语言】字符/字符串+内存函数

目录 Ⅰ、字符函数和字符串函数 1 .strlen 2.strcpy 3.strcat 4.strcmp 5.strncpy 6.strncat 7.strncmp 8.strstr 9.strtok 10.strerror 11.字符函数 12. 字符转换函数 Ⅱ、内存函数 1 .memcpy 2.memmove 3.memcmp Ⅰ、字符函数和字符串函数 1 .strlen 函数原型&#xff1a;…...

上下文管理器在Python中的妙用

更多Python学习内容&#xff1a;ipengtao.com Python上下文管理器是一个非常强大的工具&#xff0c;它能够帮助开发者在特定代码块前后自动执行特定的操作&#xff0c;常用于资源管理&#xff0c;如文件操作、数据库连接和锁定等。本文将详细介绍Python上下文管理器的概念、使用…...

【PWN · TcachebinAttack | UAF】[2024CISCN · 华中赛区] note

一道简单的tcache劫持 一、题目 二、思路 存在UAF&#xff0c;libc版本2.31&#xff0c;经典菜单题 1.通过unsorted-bin-attack来leak-libc 2.通过uaf打tcache-bin-attack劫持__free_hook实现getshell 三、EXP from pwn import * context(archamd64,log_leveldebug)ioproce…...

Java数据脱敏

数据脱敏 敏感数据在存储过程中为是否为明文, 分为两种 落地脱敏: 存储的都是明文, 返回之前做脱敏处理不落地脱敏: 存储前就脱敏, 使用时解密, 即用户数据进入系统, 脱敏存储到数据库中, 查询时反向解密 落地脱敏 这里指的是数据库中存储的是明文数据, 返回给前端的时候脱…...

【Java Web】三大域对象

目录 一、域对象概述 二、三大域对象 三、域对象使用相关API 一、域对象概述 一些可用于存储数据和传递数据的对象被称为域对象&#xff0c;根据传递数据范围的不同&#xff0c;我们称之为不同的域&#xff0c;不同的域对象代表不同的域&#xff0c;共享数据的范围也不同。 二、…...

【Linux】进程信号_3

文章目录 八、进程信号2. 信号的保存3. 信号的处理 未完待续 八、进程信号 2. 信号的保存 实际执行信号的处理动作称为信号递达(Delivery) 信号从产生到递达之间的状态,称为信号未决(Pending)。 进程可以选择阻塞 (Block )某个信号。 被阻塞的信号产生时将保持在未决状态,直到…...

LongRAG:利用长上下文大语言模型提升检索生成效果

一、前言 前面我们已经介绍了多种检索增强生成 (RAG) 技术&#xff0c;基本上在保证数据质量的前提下&#xff0c;检索增强生成&#xff08;RAG&#xff09;技术能够有效提高检索效率和质量&#xff0c;相对于大模型微调技术&#xff0c;其最大的短板还是在于有限的上下文窗口…...

go中的方法 func-----数据类型

本文是java学习者学go种产生的容易记混点的笔记,所以有其他编译语言的基础更好 go的方法有点像js 基础 func main() {fmt.Println("Starting")var p *string new(string)*p "hello world"demo : "demo"fmt.Println(*&demo) //这样既然也…...

408计算机网络--物理层

一、物理层概述 物理层是干嘛使得&#xff1f; 物理层解决如何在连接各种计算机的传输媒体上传输数据比特流&#xff0c;而不是指具体的传输媒体。 物理层主要任务是确定与传输媒体接口有关的一些特性。定义标准可以理解为插排上的两孔三孔 机械特性&#xff1a;定义物理连接…...

十年,亚马逊云科技合作伙伴网络开启AI新征程

“十年之前&#xff0c;你不认识我&#xff0c;我不认识你&#xff0c;因为云计算我们携手并肩&#xff1b;十年之后&#xff0c;我们仍是伙伴&#xff0c;更是朋友&#xff0c;因为人工智能再次起程。”这就是今天的亚马逊云科技与其合作伙伴的真实写照。 2024年是亚马逊云科技…...

基于Spring Boot的在线医疗咨询平台的设计与实现【附源码】

基于Spring Boot的在线医疗咨询平台的设计与实现 Design and implementation of the computer hardware mall based on Spring Boot Candidate&#xff1a; Supervisor&#xff1a; April 20th, 2024 学位论文原创性声明 本人郑重声明&#xff1a;所呈交的论文是本人在导师…...

星坤Type-A连接器:创新快充技术,引领电子连接!

快速发展的电子时代&#xff0c;消费者对电子设备的性能和便利性有着更高的要求。特别是在充电和数据传输方面&#xff0c;快充技术和高速传输已成为市场的新宠。中国星坤公司推出的Type-A连接器系列&#xff0c;以其卓越的性能和创新的设计&#xff0c;满足了市场对高效、稳定…...

入门JavaWeb之 Response 下载文件

web 服务器接收到客户端的 http 请求 针对这个请求&#xff0c;分别创建一个代表请求的 HttpServletRequest 对象&#xff0c;代表响应的 HttpServletResponse 对象 获取客户端请求过来的参数&#xff1a;HttpServletRequest 给客户端响应一些信息&#xff1a;HttpServletRe…...

Java自定义注解校验token并直接返回给前端状态

自定义注解 CheckToken import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public int…...

C++ | Leetcode C++题解之第200题岛屿数量

题目&#xff1a; 题解&#xff1a; class Solution { private:void dfs(vector<vector<char>>& grid, int r, int c) {int nr grid.size();int nc grid[0].size();grid[r][c] 0;if (r - 1 > 0 && grid[r-1][c] 1) dfs(grid, r - 1, c);if (r …...

Linux安全配置

Linux系统审计信息有&#xff1a;系统启动日志&#xff08;boot.log&#xff09;、记录用户执行命令日志&#xff08;acct/pacct&#xff09;、记录使用su命令的使用&#xff08;sulog&#xff09;、记录当前登录的用户信息&#xff08;utmp&#xff09;、用户每次登陆和退出信…...

vue实现不预览PDF的情况下打印pdf文件

前景&#xff1a;默认情况&#xff0c;实现打印需要根据预览的内容进行打印。 但是当只有打印按钮存在&#xff0c;不预览文件内容的情况下&#xff0c;实现打印的话&#xff0c;可以通过后端接口返回服务器上PDF的地址,前端通过隐藏的iframe标签中src可实现预览功能 主要是根据…...

C++ | Leetcode C++题解之第199题二叉树的右视图

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> rightSideView(TreeNode* root) {unordered_map<int, int> rightmostValueAtDepth;int max_depth -1;stack<TreeNode*> nodeStack;stack<int> depthStack;nodeStack.push(ro…...

[leetcode]圆圈中最后剩下的数字/ 破冰游戏

. - 力扣&#xff08;LeetCode&#xff09; class Solution {int f(int num, int target) {if (num 1) {return 0;}int x f(num - 1, target);return (target x) % num;} public:int iceBreakingGame(int num, int target) {return f(num, target);} };...

mysql数据库的管理

目录 一、常用的数据类型 二、MySQ数据库基础操作 1、登录数据库 2、查看当前的 MySQL 版本信息及连接用户名 3、查看当前服务器中的数据库 4&#xff0e;查看数据库中包含的表 5&#xff0e;查看表的结构&#xff08;字段&#xff09; 6、MySQL的6大约束属性 三、SQL…...

Windows微信QQ防撤回补丁:告别消息撤回烦恼的终极指南

Windows微信QQ防撤回补丁&#xff1a;告别消息撤回烦恼的终极指南 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁&#xff08;我已经看到了&#xff0c;撤回也没用了&#xff09; 项目地址: https://gitcode.co…...

在 Taotoken 平台如何根据项目需求与预算在模型广场进行选型

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在 Taotoken 平台如何根据项目需求与预算在模型广场进行选型 当你准备为一个新项目引入大模型能力时&#xff0c;面对市场上众多的…...

5分钟解决Mac NTFS读写难题:免费开源工具完全指南

5分钟解决Mac NTFS读写难题&#xff1a;免费开源工具完全指南 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting, and management for NT…...

手一滑,我把整个店都报上了活动

做Temu最怕什么&#xff1f;不是没单&#xff0c;不是被压价&#xff0c;是手滑。 去年有一次&#xff0c;我打算给店里十几个新款报个日常活动冲冲量。打开Temu商家后台&#xff0c;店铺营销&#xff0c;营销活动&#xff0c;找到合适的活动场次点了“去报名”。报名页里商品…...

BilibiliDown实战指南:3大核心功能深度解析与高效下载方案

BilibiliDown实战指南&#xff1a;3大核心功能深度解析与高效下载方案 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirro…...

三步完成抖音内容高效备份:免费无水印下载工具完全指南

三步完成抖音内容高效备份&#xff1a;免费无水印下载工具完全指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback supp…...

从零构建私有容器镜像仓库:基于Registry 2与MinIO的实战部署指南

1. 项目概述&#xff1a;从零到一构建一个现代化的容器镜像仓库 在云原生和微服务架构成为主流的今天&#xff0c;容器镜像作为应用交付的标准单元&#xff0c;其存储、分发和管理的重要性不言而喻。Docker Hub 是大家最熟悉的公共仓库&#xff0c;但在企业级生产环境中&#…...

鸣潮自动化工具ok-ww完整指南:3步实现智能后台挂机

鸣潮自动化工具ok-ww完整指南&#xff1a;3步实现智能后台挂机 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸 一键日常 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves 你是否厌倦了在《鸣…...

GPT模型评估实战:开源工具gpt-stats构建多维度能力评测体系

1. 项目概述&#xff1a;一个为GPT模型“体检”的开源利器如果你和我一样&#xff0c;日常工作中经常和各类GPT模型打交道&#xff0c;无论是调用OpenAI的官方API&#xff0c;还是部署、微调开源的Llama、Qwen等模型&#xff0c;心里总会萦绕着一个问题&#xff1a;这个模型到底…...

从航拍云台到机器人关节:手把手教你用STM32F103和MPU6050实现二自由度姿态稳定

从零打造二自由度姿态稳定系统&#xff1a;STM32F103与MPU6050实战指南 1. 项目背景与核心需求 在无人机航拍、机器人关节控制等领域&#xff0c;姿态稳定系统扮演着关键角色。想象一下&#xff0c;当你用自制无人机拍摄视频时&#xff0c;画面总是晃动不稳&#xff1b;或者机器…...