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

news2024/12/22 17:06:11

文章目录

  • 前言
  • 一. 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;
    //找到目标空间的\0
    while(*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.coloradmin.cn/o/1126435.html

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

相关文章

CentOS7安装部署CDH6.2.1

文章目录 CentOS7安装部署CDH6.2.1一、前言1.简介2.架构3.环境 二、环境准备1.部署服务器2.安装包准备3.修改机器名4.关闭防火墙5.关闭 SELinux6.Hosts文件7.limits文件8.设置swap空间9.关闭透明巨页内存10.免密登录 三、安装CM管理端1.安装第三方依赖包2.安装Oracle的JDK3.安装…

Rockchip RK3399 - DRM crtc基础知识

一、LCD硬件原理 1.1 CRT介绍 CRT是阴极射线管(Cathode Ray Tube)的缩写&#xff0c;它是一种使用电子束在荧光屏上创建图像的显示设备。CRT显示器在过去很长一段时间内是主流的显示技术&#xff0c;现已被液晶显示屏或其他新兴技术所替代。 在CRT显示器中&#xff0c;扫描电子…

k8s-----6、pod的镜像拉取、重启策略、资源限制

镜像拉取、重启策略、资源限制 1、镜像拉取2、资源限制3、重启机制 1、镜像拉取 [rootmaster ~]# cat nginx.yaml apiVersion: v1 kind: Pod metadata:name: mypod spec:containers:- name: nginximage: nginx:1.14imagePullPolicy: Always# IfNotPresent: 默认值&#xff0c…

CPO是啥?

CPO是啥&#xff1f; CPO通常是“Chief Product Officer”&#xff08;首席产品官&#xff09;的缩写&#xff0c;是企业高层管理团队中负责产品管理和战略规划的主要负责人。CPO通常负责制定公司的产品战略、管理产品组合、带领产品团队以及推动产品的创新和优化。他或她需要有…

引用类型的按值传递

按值传递时&#xff0c;传递过去的是该引用类型实例的引用的一个拷贝&#xff0c;这样说可能不是很清楚&#xff0c;而且容易引起误解。所谓引用&#xff0c;就是分配在栈上的一小块内存区域&#xff0c;里面存放着该引用类型实例在托管堆上的地址。引用类型在按值传递的时候&a…

CUDA学习笔记(十三) Shared Memory

CUDA SHARED MEMORY shared memory在之前的博文有些介绍&#xff0c;这部分会专门讲解其内容。在global Memory部分&#xff0c;数据对齐和连续是很重要的话题&#xff0c;当使用L1的时候&#xff0c;对齐问题可以忽略&#xff0c;但是非连续的获取内存依然会降低性能。依赖于…

codeshell安装配置

codeshell安装配置 1 注意事项1.1 Python版本问题 2 codeshell环境搭建2.1 codeshell使用软件各版本2.2 软件下载2.3 codeshell使用环境安装2.3.1 python-3.10.9-amd64.exe安装2.3.2 Anaconda3-2022.10-Windows-x86_64.exe安装2.3.3 创建环境2.3.4 Pytorch安装2.3.5 transforme…

C++中的多态以及如何实现多态(近万字图文详解)

C中的多态 1. 多态的概念1.1 概念 2. 多态的定义及实现2.1多态的构成条件&#xff08;重点&#xff09;2.2 虚函数2.3 虚函数的重写(重点)2.4 C11 override 和 final2.5 重载、覆盖(重写)、隐藏(重定义)的对比 3. 抽象类3.1 概念3.2 接口继承和实现继承 4. 多态的原理4.1虚函数…

MySQL1——喵喵期末不挂科

宝宝&#xff0c;你不点个赞吗&#xff1f;不评个论吗&#xff1f;不收个藏吗&#xff1f; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的很重要…

零代码编程:用ChatGPT多线程批量将PDF文档转换为word格式

pdf2docx是Python的一个库&#xff0c;可以很方便的将PDF文档转换为word格式&#xff0c;首先安装这个库。 然后在ChatGPT中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个文档格式转换的任务&#xff0c;具体步骤如下&#xff1a; 打开F盘的Books文件…

FreeRTOS基础(如何学好FreeRTOS?)

目录 基础知识 进阶内容 后期“摆烂” 基础知识 实时操作系统 (RTOS)&#xff1a;FreeRTOS是一个实时操作系统&#xff0c;它提供了任务管理、调度和同步等功能&#xff0c;在嵌入式系统中有效地管理多个任务。 任务&#xff08;Task&#xff09;&#xff1a;任务是在RTOS…

祝所有的程序猿们2023年的1024节快乐~

许久没更新Bolg了&#xff0c;眼看就要到1024节&#xff0c;其实也是没有可以更新的东西&#xff0c;目前在PhD&#xff0c;发现很多东西都还需要慢慢沉淀&#xff0c;放一doctoral college 开学的时候ppt的老图。 越往深处研究会陷入泥潭&#xff0c;考虑的细节将会越来越多&…

如何在Ubuntu下安装RabbitMQ服务并异地远程访问?

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基…

【Gensim概念】03/3 NLP玩转 word2vec

第三部分 对象函数 八 word2vec对象函数 该对象本质上包含单词和嵌入之间的映射。训练后&#xff0c;可以直接使用它以各种方式查询这些嵌入。有关示例&#xff0c;请参阅模块级别文档字符串。 类型 KeyedVectors 1&#xff09; add_lifecycle_event(event_name, log_level2…

Web前端—Flex布局:标准流、浮动、Flex布局、综合案例(短视频首页解决方案)

版本说明 当前版本号[20231024]。 20231024初版 目录 文章目录 版本说明目录Flex布局01-标准流02-浮动基本使用产品区域布局HTML标签CSS样式 清除浮动场景搭建额外标签法单伪元素法双伪元素法overfow法 03-Flex布局Flex组成主轴对齐方式侧轴对齐方式修改主轴方向弹性伸缩比弹…

从昏暗到明亮—改善照明环境,提升编程效率

作为一名程序员博主&#xff0c;长时间写代码、写博客&#xff0c;对着电脑屏幕的生活方式已经渐渐成为了我的日常。 然而&#xff0c;这种生活方式却给我的眼睛带来了相当大的压力。每当一天的工作结束&#xff0c;我的眼睛总是感到干涩、疲劳&#xff0c;让我感到不舒适。&am…

S5PV210裸机(六):SD卡

本文主要探讨s5pv210的SD的相关知识。 存储 软盘、硬盘、光盘、CD、磁带:磁存储,读写慢、可靠性低 NandFlash、NorFlash:电存储,读写接口时序复杂,接口众多 SD卡、MMC卡、MicroSD、TF卡:统一外部封装和接口,SD兼容MMC标准 iNand、MoviNand、e…

正点原子嵌入式linux驱动开发——Linux MISC驱动

misc的意思是混合、杂项的&#xff0c;因此MISC驱动也叫做杂项驱动&#xff0c;也就是当板子上的某些外设无法进行分类的时候就可以使用MISC驱动。MISC驱动其实就是最简单的字符设备驱动&#xff0c;通常嵌套在platform总线驱动中&#xff0c;实现复杂的驱动&#xff0c;本章就…

Web APIS——第一天(下)

一、随机轮播图案例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content"widthde…

JAVA多线程基础篇--守护线程(Daemon Thread)

1.概述 JAVA中的线程主要分为两类&#xff1a;用户线程&#xff08;User Thread&#xff09;和守护线程(Daemon Thread)。JAVA语言中无论是线程还是线程池&#xff0c;默认都是用户线程&#xff0c;因此用户线程也被称为普通线程。守护线程也被称之为后台线程、服务线程或精灵…