C语言_字符串和内存函数

文章目录

  • 前言
  • 一. strlen
  • 二. strcpy
  • 三.strcat
  • 四. strcmp (字符串比较)
  • 五. strncpy
  • 六. strncmp
  • 七. strstr
  • 八. strtok
  • 九 . strerror perror
  • 十. 字符分类函数
  • 十一. memcpy (内存拷贝)
  • 十二. memmove(可以重叠拷贝 也可以实现不重叠的内存拷贝)


前言

C语言的标准库函数
用法讲解
代码样例

一. strlen

size_t strlen (const char * str );

  • 字符串以 ’ \0 ’ 作为结束标志,strlen 函数返回的是在字符串中 ’ \0 ’ 前面出现的字符个数(不包含 ’ \0 ’ )。
  • 参数指向的字符串必须要以 ’ \0 ’ 结束。
  • 注意函数的返回值为size_t 是无符号的(易错)
  • 学会strlen函数的模拟实现
//  1
//size_t my_strlen(const char* str)
//{
//    int count = 0;
//    while (*str != '\0')
//    {
//        count++;
//        str++;
//    }
//    return count;
//}// 2.指针-指针
// 3.递归的方法
int main()
{size_t sz = my_strlen("abc");printf("%u\n", sz);return 0;
}

二. strcpy

  • 源字符串必须以 ‘\0’ 结束。
  • 会将源字符串中的 ‘\0’ 拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可变.
#include <assert.h>
char* my_strcpy(char* dest, const char* src)
{char* ret = dest;assert(dest != NULL);assert(src != NULL);while (*dest++ = *src++){;}return ret;
}int main()
{char arr1[20] = "hello world";char arr2[] = "xxxxx";printf("%s\n", arr1); my_strcpy(arr1, arr2);printf("%s", arr1);return 0;
}

三.strcat

  • 源字符串必须以 ’ \0 ’ 结束
  • 目标空间必须足够大,能容纳下源字符串的内容。
  • 目标空间必须可修改
  • 字符串自己给自己追加
char * my_strcat(char* dest,const char* src)
{assert(dest);assert(src);char* ret = dest;//找到目标空间的\0while(*dest){dest++;}while(*dest++  =  *src++){;}return ret; 
}int main()
{ char arr1[20] = "hello";char arr2[] = "world";my_strcat(arr1, arr2);printf("%s\n", arr1);return 0;
}

四. strcmp (字符串比较)

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

- 那如何判断两个字符串?


五. strncpy

六. strncmp

描述:
strncmp() 是一个标准库函数,用于比较两个字符串的前 n 个字符是否相等。
strncmp() 函数通常用于比较两个字符串,以确定它们是否相等或哪个字符串在字典顺序上更小。

C 库函数 int strncmp(const char *str1, const char *str2, size_t n) 把 str1 和 str2 进行比较,最多比较前 n 个字符。

声明:
int strncmp(const char *str1, const char *str2, size_t n)

参数:

返回值:

int main()
{char arr1[] = "abcqwertyuipso";char arr2[] = "abcdef";printf("%d\n",strncmp(arr1, arr2, 3));return 0;
}

实例:


七. strstr

(字符串中找子字符串)

如果未找到则返回 null


八. strtok

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

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

九 . strerror perror

把错误码转化成错误信息


十. 字符分类函数


十一. memcpy (内存拷贝)

int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[20] = { 0 };//将arr1 拷贝到 arr2 中memcpy(arr2, arr1, 40);int i = 0;for (i = 0; i < 20; i++){printf("%d ", arr2[i]);}return 0;
} 

memcpy 函数是用来处理不重叠的内存拷贝的

#include<assert.h>
void* my_memcpy(void* dest, const void* src, size_t num)
{void* ret = dest;assert(src && dest);while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}return ret;
}int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[20] = { 0 };my_memcpy(arr1+2, arr1, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}

结果:

原因:


十二. memmove(可以重叠拷贝 也可以实现不重叠的内存拷贝)

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

模拟实现

void* my_memmove(void* dest, const void* src, size_t num)
{void* ret = dest;assert(dest && src);if (dest < src){// 前>后while (num--){*(char*)dest = *(char*)src;dest=(char*)dest + 1;src = (char*)src + 1;}}else{//后->前while (num--)//20{*((char*)dest + num) = *((char*)src + num);}}return ret;
}int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };//int arr2[20] = { 0 };my_memmove(arr1 + 2, arr1, 8);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}

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

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

相关文章

VC++程序崩溃时,使用Visual Studio静态分析dump文件

Window环境下的C程序如果发生异常崩溃&#xff0c;首先会和客户联系&#xff0c;让帮忙取特定目录下的dump文件和log文件来分析崩溃的原因。不过发生崩溃的话&#xff0c;从log一般分析不出特定原因&#xff0c;这时候dump文件就起作用了。可以通过Visual Studio和Windbg来静态…

java八股文(基础篇)

面向过程和面向对象的区别 面向过程&#xff1a;在解决问题时&#xff0c;特别自定义函数编写一步一步的步骤解决问题。 面向对象&#xff1a;其特点就是 继承&#xff0c;多态&#xff0c;继承&#xff0c;在解决问题时&#xff0c;不再注重函数的编写&#xff0c;而在于注重…

高效学习工具之Anki新手入门指南(ios端,包括ipad、ihpone设备)————创建、使用、备份、相关资料

文章目录 0 背景0.1 闭环学习0.2 什么是anki 1 开始使用1.1 导入1.2 创建空白组1.3 创建卡片&#xff08;&#xff09;1.3.1 利用anki创建卡片的两种方法1.3.2 复习材料分类 1.4 开启v3算法&#xff0c;设置排程1.4 自定义排程 2 操作卡牌&#xff08;位于卡牌界面中“游览”&a…

数据库认证 | Oracle OCP好考吗

数据库对于很多技术人员来说都不陌生&#xff0c;但是你想深入了解的话&#xff0c;那么考个证书也许就是一个不错的选择。 如果能考个Oracle OCP认证的话&#xff0c;那也确实不错。那么Oracle OCP好考吗&#xff1f;下面我们就来了解一下吧。 01 Oracle OCP好考吗 OCP考试还…

C++快餐——C++11(2)

如期待奇迹发生&#xff0c;那唯有不停伸手去抓紧&#xff0c;去把握才行。 文章目录 类成员变量缺省值default关键字delete关键字final关键字可变参数模板STL容器中empalce相关接口函数优点 lambda表达式捕获列表注意&#xff01;&#xff01;&#xff01;底层实现 总结 类成员…

leetcode-栈与队列

C中stack 是容器么&#xff1f; 栈&#xff0c;队列往往不被归类为容器&#xff0c;而被归类为container adapter(容器适配器)。因为由底层的容器实现&#xff0c;同时使用适配器模式的设计模式&#xff0c;封装了一层。 我们使用的stack是属于哪个版本的STL&#xff1f;SGI ST…

电路的电线的拼接

不积跬步无以至千里&#xff0c;今天小编也是复习今天学习的内容&#xff0c;废话不多说&#xff0c;看博客吧&#xff01;&#xff01;&#xff01; 目录 准备条件 操作 成品 准备条件 操作 将定制的套管插入导线当中&#xff0c;24V或者0V是尖端的端子&#xff0c;后面根…

基于SSM的养老院管理系统

基于SSM的养老院管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatisVUE工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 摘要 养老院管理系统是一个基于SSM&#xff08;Spring、Spring MVC、MyBatis&…

微信定时发圈,快人一步不落索

现在的社交媒体运营已经成为了私域流量获取的重要手段&#xff0c;而微信作为最大的社交平台之一&#xff0c;更是吸引了众多使用者。但是&#xff0c;你是否曾经感叹过每天手动发朋友圈的繁琐&#xff1f;是否希望能够事先设置好定时发送的功能&#xff0c;让你的朋友圈自动更…

Spring Boot 3系列之一(初始化项目)

近期&#xff0c;JDK 21正式发布&#xff0c;而Spring Boot 3也推出已有一段时间。作为这两大技术领域的新一代标杆&#xff0c;它们带来了许多令人振奋的新功能和改进。尽管已有不少博客和文章对此进行了介绍&#xff0c;但对于我们这些身处一线的开发人员来说&#xff0c;有些…

【JavaEE】HTTP协议

HTTP协议 HTTP是什么?HTTP 协议格式HTTP 请求格式HTTP响应格式协议格式总结 HTTP 请求 (Request)认识 URLURL 基本格式 关于 URL encode认识 "方法" (method)1. GET 方法2. POST 方法 认识请求 "报头" (header) HTTP 响应详解认识 "状态码" (st…

【嵌入式开发 Linux 常用命令系列 9 -- linux系统终端命令提示符设置(PS1)】

文章目录 Linux PS1 介绍PS1 纯文本和特殊的转义序列PS1 颜色设置 Linux PS1 介绍 在Linux中&#xff0c;PS1&#xff08;Prompt String 1&#xff09;是一个环境变量&#xff0c;用来定义shell命令提示符的显示内容和格式。当你在终端中输入命令时&#xff0c;PS1定义的就是那…

Jupyter Notebook的使用

文章目录 Jupyter Notebook一、Jupyter Notebook是什么&#xff1f;二、使用步骤1.安装Miniconda2.安装启动**Jupyter Notebook**3.一些问题 三、Jupyter Notebook的操作1.更换解释器2.在指定的文件夹中打开 四.报错解决1.画图的时候出现报错2.画图的时候空白3.pandas相关的错误…

flink 反压原理

背景 在flink中由于数据倾斜或者数据处理速率的不匹配&#xff0c;很容易引起反压&#xff0c;本文就看一下flink反压的原理 flink反压原理 flink全流程pineline的反压实现其实依赖于TaskManager之间的反压和TaskManager内部的反压来实现 1.TaskManager之间的反压 2.Task…

前端学习之webpack

概述 webpack是一个流行的前端项目构建工具&#xff08;打包工具&#xff09;&#xff0c;可以解决当前web开发中所面临的问题。 webpack提供了友好的模块化支持&#xff0c;以及代码压缩混淆、处理js兼容问题、性能优化等强大的功能&#xff0c;从而让程序员把工作重心放到具…

RT-Thread内核——内核基础(上)

1、内核简介 内核是操作系统的核心&#xff0c;是操作系统最基础也是最重要的部分&#xff0c;主要负责系统的线程、线程间通信、系统时钟、中断以及内存等。其架构图如下&#xff1a; 2、线程调度 线程是RT-Thread操作系统中最小的调度单位&#xff0c;线程调度算法的基于…

CentOS 7 安装和配置java环境

1 安装包准备 安装包可以通过下面地址进行版本选择安装&#xff1a; https://www.oracle.com/java/technologies/downloads/#java8 2 正式开始安装 本次分享的安装方法直接通过编辑/etc/profile文件实现java的安装 2.1 新建安装包存放目录 mkdir /java cd /java/ 2.2 解压安…

【C/C++】函数重载注意事项

函数重载概述 函数重载满足条件&#xff1a; 同一个作用域下函数名称相同函数参数类型不同 或者 个数不同 或者 顺序不同 注意: 函数的返回值不可以作为函数重载的条件。 函数重载注意事项 引用作为重载条件函数重载碰到函数默认参数 //函数重载注意事项 //1、引用作为重载…

RDBMS 的历史回顾

“数据库”这个词是怎么来的&#xff1f;当 SQL 是 SEQUEL 时它代表什么&#xff1f;通过这篇有关 RDBMS 历史的文章了解所有这些内容以及更多内容。 埃里克迪特里希用户头像 经过 埃里克迪特里希 核心 Anush Gasparyan 用户头像 经过 阿努什加斯帕里安 2017年7月21日 意见…

Redis(10)| I/O多路复用(mutiplexing)

上文select/epoll 在上文《Redis&#xff08;09&#xff09;| Reactor模式》 思考问题可以使用I/O多路复用技术解决多多客户端TCP连接问题&#xff0c;同时也提到为了解决最早期的UNIX系统select调用存在的四个问题。 select(int nfds, fd_set *r, fd_set *w, fd_set *e, stru…