[C语言]string.h常用字符串库函数详解+模拟实现

002_[string.h]c标准库函数之<string.h> 话说c中有很多标准库函数,其中最具特色的就是字符串相关的库函数,而这类函数也是最让人头大的,当然,熟悉后就不大了,头就小了,哈哈,以下是自己的温习记录以及心得,拿出来与同行们分享下,希望有错误的地方大家给指出来,3Q,话不多说,我们开始...... 阅读详情


目录

字符串函数

strlen

strcpy

strcat

strcmp

strstr

内存函数

memcpy

memmove


人生百态,苦事之多。烦恼穿心,何来解脱?打开博客,吸取干货。

以码消愁,以串解忧。泱泱年轮,唯有生活。一起撸串,快乐几何。

字符串函数

strlen

在C语言中,我们通过字符数组的方式来存储字符串,也可以直接使用常量字符串,如何去判断字符串的长度便是一个问题。比如char ch[100] = "abcdef";  难道长度就是100吗?显然不对,我只有abcdef这六个字母,长度应该为6才对,所谓上天有好生之德,留下了一个库函数strlen可以求得字符串的长度。

#include <stdio.h>
#include <string.h>
int main()
{
    char ch[100] = "abcdef";
    int len = strlen(ch);
    printf("%d\n", len);//结果为6
    len = strlen("abcdef")
    printf("%d\n", len);//结果依然为6
    return 0;
}

strlen使用起来竟如此方便,只需把数组名或常量字符串往里一掷,它便会自己返回字符串长度。

如何模拟实现计算字符串长度?我们需要知道,C语言是如何打印字符串的。

char ch[] = "abcdef";
printf("%s\n", "abcdef");
printf("%s\n", ch);

放一个字符串以%s打印显然没问题,但是放一个数组名用%s打印也没问题,而数组名是什么?数组名是数组首元素地址(除开sizeof和&的特殊情况)那是否常量字符串也是首元素地址?

printf("%p\n", "abcdef");

由此可以得知,其实C语言打印字符串是根据它的首元素地址一直往下找,找到一个打印一个,那么何时停止?根据我们扎实的C语言基础知识,我们都知道字符串以\0结尾,所以找到\0的时候便不用再打印了。

知道了原理,接下来就是模拟实现了。既然字符串是根据地址找的,我们就传入首地址,既然是以\0结尾的,我们就把\0之前的字符全部统计一遍,这样就能得到字符串长度了。

int my_strlen(const char* str)//因为只需要统计个数 不需要改变字符 所以用const
{
    assert(str); //防止传NULL指针 引用头文件assert.h进行断言
    int len = 0;
    while(*str != '\0')
    {
        str++;
        len++;
    }
    return len;
}

strcpy

strcpy函数用于把一个字符串拷贝到另一个字符串中。但要在使用的时候注意一些事项:

1. 目标空间必须足够大   2. 源空间必须存在\0   3.目标空间必须可以更改

char ch[100];//目标空间可更改 且足够大
char cpy[] = "abcdef";//源空间存在\0
strcpy(ch, cpy);//将cpy的内容拷贝到ch中
printf("%s\n", ch);

既然我们知道字符串以\0结尾,那我们只需要知道他们两个字符串的首元素地址,然后到被拷贝字符串的\0为止全部拷贝进去即可。

模拟实现:

char* my_strcpy(char* dest, const char* src)
{
    assert(dest && src);//断言
    char* ret = dest;//用于返回给用户拷贝完后的地址 方便用户操作
    while(*dest++ = *src++);//当src不为\0时拷贝到dest中 并后移一位
    return ret;
}

strcat

strcat(str1, str2);会把str2的内容追加到str1后面。​但也有一些注意事项:

1.目标空间必须足够大   2.目标空间必须存在\0   3.源空间必须存在\0  4.目标空间必须可更改

char ch1[100] = "I love";//目标空间足够大且存在\0且可更改
char ch2[] = " You";//源空间存在\0
strcat(ch1, ch2);
printf("%s\n", ch1);

模拟实现:(找到目标空间\0之后和strcpy实现方式类似)

char* my_strcat(char* dest, const char* src)
{
	assert(dest && src);
	char* ret = dest;
	while(*dest)
	{
		dest++;
	}
	while(*dest++ = *src++);
	return ret;
}

strcmp

当我们需要比较两个字符串是否一致时,许多小白都会直接用 == 进行比较,但我们之前提到过,字符串本质上是首元素地址, ==进行比较时比较的也是首元素的地址,所以答案会与我们的期待的不符,实际上C语言有一个库函数strcmp可以比较两个字符串,相等返回0,不相等时返回值根据第一个不等的字符词典序进行返回(大于返回>0 小于返回<0) 如: a 和 b   显然 词典序中a<b则返回一个<0的数。

char ch1[] = "abc";
char ch2[] = "abc";
char che3[] = "abd";
int flag1 = strcmp(ch1, ch2);//0
int flag2 = strcmp(ch1, ch3);//<0

模拟实现:从头开始比较,相等继续比较,不等根据词典序返回,比到\0返回0

int my_strcmp(const char* str1, const char* str2)
{
	while(*str1 == *str2 && *str1 && *str2)
	{
		if(*str1 == '\0')
			return 0;
		str1++,str2++;
	}
	return *str1 - *str2;
}

strstr

strstr的作用是在一个字符串中查找子串并返回地址。

char ch[] = "I love you";
char* low = strstr(ch, "love");//在ch中查找 love  找到返回love的首地址 找不到返回NULL
printf("%s\n", low);//love you

模拟实现:既然是找子串,那么主串没找完且长度大于子串的情况下都得继续找,所以为了方便我们就多创建一个指针指向当前主串要找的起始位置,然后循环比较。

char* my_strstr(const char* str1, const char* str2)
{
	char* s1 = str1;
	char* s2 = str2;
	char* cp = str1;
	while(*cp)
	{
		s1 = cp;
		s2 = str2;
		while(*s1 && *s2 && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if(*s2 == '\0')
			return cp;
		cp++;
	}
	return NULL;
}

内存函数

既然干货都发出来了,何不再来了解了解string.h中的内存函数?

memcpy

内存函数的优点就在于可以自己指定字节数,且兼容所有的指针类型。

int a = 4;
inb b;
memcpy(&b, &a, 4);//把a地址开始到后面4个字节复制给b(a为整型 4个字节 即把a复制给b)

实现:我们需要知道要兼容所有的地址类型,我们需要void*指针 由于又是按字节复制 所以我们将void*使用时强制类型转换为char*即可。

void* my_memcpy(void* dest, const void* src, int size)
{
    assert(dest && src);
    void* ret = dest;
    while(size--)
    {
        *(char*)dest = *(char*)src;
        dest = (char*)dest + 1;//不用++的原因是 void*指针直接++只有在某些编译器上才可以
        src = (char*)src + 1;
    }
    return ret;
}

memmove

memmove相比memcpy啥的可厉害太多了,memcpy如果自己复制给自己就有可能因为重叠覆盖而出错,而memmove就修复了这一点。

memmove是如何弥补这一点的?比如 12345  你要复制45 到34的位置 如果我们先复制5 那么就会把4覆盖 复制4的时候就会出现问题, 但我们先复制4便可以解决。所以memmove可以根据你复制的目标位置和源位置作比较得到的结果,来判断先复制左端还是右端,避免重叠空间被覆盖。

用法与memcpy一致 所以不再演示。

模拟实现:

void* memmove(void* dest, const void* src, int size)
{
    assert(dest && src);
    void* ret = dest;
    if(dest <= src || (char*)dest >= (char*)src + size)//即没有重叠空间或目标空间在左方时
    {
        while(size--)
        {
            *(char*)dest = *(char*)src;
            dest = *(char*)dest + 1;
            src = *(char*) + 1;
        }
    }
    else//当重叠时 dest在右方时
    {
        dest = *(char*)dest + size;
        src = *(char*)src + size;
        while(size--)
        {
            *(char*)dest = *(char*)src;
            dest = *(char*)dest - 1;
            src = *(char*) - 1;
        }
    }
}
xctf攻防世界 MISC高手进阶区 low 1. 进入环境,下载附件 给出的一张bmp图片,没有其他信息 2. 问题分析 扔进binwalk中,没有发现有用信息 使用zsteg,没有有用信息 塞入StegSolve中,发现有点猫腻,如图: 有点二维码的感觉,emmm,需要像素处理,但不知道如何下手,参考网上的wp,发现是让使用lsb隐写,copy代码: from PIL import Image img = Image.open('./pic/low.bmp') img_tmp = img.copy() pix = img_tmp.load() 阅读详情

相关推荐

使用 Mid360 从零开始搭建实物机器人入门级导航系统 —— 基于 Fast_Lio 和 Move_Base

本文详细介绍了如何使用Mid360机器人从零开始搭建一个基于Fast_Lio和Move_Base的入门级导航系统。通过配置 ROS2、集成激光雷达、IMU、Fast_Lio、Move_Base 等模块,我们成功构建了一个能够实现自动导航的机器人系统。在实际开发中,随着需求的变化,你可以不断调整参数、优化路径规划算法、增加新的传感器等,逐步提升机器人的智能与功能。

小蜗牛的珍贵百宝箱 3564

C语言库函数——string.h

在学习C语言的过程中,当使用字符串时,我们会经常使用string.h这个库函数。那么,这个库函数究竟有哪些需要我们学习的,哪些又是我们经常会使用的。string.h是C语言标准库中一个常用的头文件,在使用到字符数组时需要使用。string .h头文件定义了一个变量类型、一个宏和各种操作字符数组的函数。拷贝一个字符串到另一个。...

Xa_L 3万+

深入分析大众点评 Ajax 接口:直接请求 JSON 数据高效获取评论

大众点评网站采用前后端分离架构,通过Ajax接口动态加载数据。按F12打开开发者工具,切换到Network(网络)面板。实际环境中,我们需要使用Python重现这一加密逻辑。查看请求响应,寻找包含评论数据的JSON接口。参数是大众点评的反爬机制核心,需要特别处理。:尊重网站的robots.txt文件规定。:仅将数据用于合法合规的研究和分析目的。:不侵犯大众点评的商业秘密和知识产权。打开大众点评网站,进入任意商户页面。:对采集到的用户信息进行脱敏处理。:避免对目标网站造成过大负担。

Z_suger7的博客 1583

C语言标准库<string.h>

C语言标准库<string.h>是处理字符串操作的核心头文件,提供内存操作、字符串操作和比较三类函数。主要包含size_t类型、NULL宏以及memcpy、strcpy等常用函数。使用时需注意:1.安全性优先使用带"n"的安全版本;2.确保缓冲区足够大;3.考虑线程安全问题;4.注意区域设置对strcoll等函数的影响。最佳实践包括检查缓冲区大小、验证输入参数、避免重复计算长度等。该头文件自1979年K&R C标准引入,后成为ANSI/ISO C标准的重要组成部分。

vbnetcx的博客 3万+

群晖Web Station实战:从零搭建个人静态导航站

本文详细介绍了如何利用群晖NAS自带的Web Station套件,从零开始搭建个人静态导航站。通过安装Web Station、上传静态网站源码、配置网页服务与网络门户等步骤,无需代码基础即可实现内网访问。文章还分享了文件权限设置、个性化定制及常见问题排查等实用技巧,帮助用户高效管理个人常用网址,充分挖掘NAS的服务器潜能。

tea88的博客 1330

【YOLOv12改进trick】高效多尺度卷积注意力EMCAD_Block模块引入YOLOv12,实现涨点和效率提升,含创新点Python代码

EMCAD引入YOLOv12模块,实现高效多尺度注意力模块引入到YOLOv12中的快速涨点及效率提升

向上生长的程序媛的博客 851

C语言——常用字符串库函数的介绍

以下函数的使用均需要包含头文件求字符串长度函数strlen长度不受限制的字符串函数长度受限制的字符串函数字符串查找函数错误信息报告函数strerror在C语言中,对字符串的处理是十分频繁的。但是,C语言本身是没有字符串类型的,通常字符串被存放在字符数组和常量字符串中。唯一标识字符串的结束标志是**‘\0’**字符。补充:常量字符串通常存放在内存中的文字常量区内,常量字符串的内容不可以被修改。

sinzz的博客 2581

全覆盖路径规划开源项目Clean-robot-turtlebot3关键函数解析(下)

本系列文章主要介绍全覆盖路径规划开源项目Clean-robot-turtlebot3的相关内容,包含如下四篇文章,分别介绍了开源项目Clean-robot-turtlebot3流程的概括总结、ROS坐标系常用坐标及其变换、Clean-robot-turtlebot3关键函数解析等内容。

慕羽★的博客 2298

c语言字符串库函数#include string.h (全部)

c语言字符串库函数#include<string.h> 字符串函数<string.h> 在头文件<string.h>中定义了两组字符串函数。第一组函数的名字以str开头;第二组函数的名字以mem开头。只有函数memmove对重叠对象间的拷贝进行了定义,而其他函数都未定义。比较类函数将其变量视为unsigned char类型的数组。 1 strcpy #inclu...

baobeiduoduo的博客 5543

第2.0章 机器人C++学习开篇(一):SLAM为什么使用C++语言及学习路线资料推荐

ROS(机器人操作系统):机器人领域的“操作系统”,提供节点通信、参数管理、工具链支持,是SLAM算法在机器人上部署的核心框架。PCL(点云库):处理三维点云数据的利器,包含滤波、分割、配准等算法,是激光SLAM的核心依赖。Eigen(矩阵运算库):高效的矩阵与线性代数运算库,SLAM中的位姿变换、优化求解都依赖它。Ceres/G2O(优化库):SLAM后端优化的“王牌”,Ceres擅长通用非线性优化,G2O则专为图优化设计,二者是BA( bundle adjustment)等算法的实现基础。

行知SLAM 1241

最新Python爬虫实战(入门爬虫篇)——案例18:某气象局全国天气预报数据采集(详细爬虫思路截图 + 抓包动图演示+完整爬虫代码+详细注释)

本次案例针对某气象局天气预报网的静态HTML页面,实现了全国各地区天气数据的全自动化爬取,和之前案例17的动态接口爬虫不同,本次案例聚焦于静态页面的爬虫实现,覆盖了从抓包分析、请求模拟、数据解析到数据存储的完整爬虫流程,非常适合入门学习者巩固基础,核心知识点和实现要点总结如下:首先是页面分析的核心逻辑,静态HTML页面的数据爬取,核心在于通过浏览器开发者工具,完成完整的抓包分析和标签结构定位。

努力让自己发光,对的人才能迎着光而来 27万+

c语言字符串库函数#include<string.h>

c语言字符串库函数#include<string.h> 字符串函数<string.h> https://www.cnblogs.com/haore147/p/3647555.html 在头文件<string.h>中定义了两组字符串函数。第一组函数的名字以str开头;第二组函数的名字以mem开头。只有函数memmove对重叠对象间的拷贝进行了定义,而其他函数都未定义。比较类函数将其变量视为unsigned char类型的数组。 1 strcpy #include <s

chenshaobin6740680的博客 5632

华为OD机试双机位C卷:采购订单 (Py/Java/C/C++/Js/Go)

华为OD机试双机位C卷 采购订单,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,并提供在线OJ模拟做题。华为OD机试真题【采购订单】

qq_45776114的博客 3534

C语言字符串库函数 #include <string.h>

c语言字符串库函数#include<string.h> 在头文件<string.h>中定义了两组字符串函数。第一组函数的名字以str开头;第二组函数的名字以mem开头。只有函数memmove对重叠对象间的拷贝进行了定义,而其他函数都未定义。比较类函数将其变量视为unsigned char类型的数组。 1 strcpy #include <string.h> char* strcpy(char *str1, const char *str2); 把字符串str2(包括

leonoe121的博客 1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C语言常用字符串库函数总结

C语言常用字符串库函数总结 C语言常用字符串库函数总结 新人报道,总结一下C语言字符串库函数的使用,一方面是和大家分享,一方面也是为了加深记忆,主要参考《C和指针》一书,若有描述不当,望指教。 1、 字符串基础 C语言不像其他编程语言有专门的字符串类型,C语言的字符串一般是存于字符数组或由字符指针表示,字符串是指一串零个或多个字符,并且以一个位模式为全0的NUL字节结尾,因为NUL为非打印字符,所以选它为终止符,字符串的这个特性非常重要!!!而字符串的长度指的是NUL之前字符的长度,不包括NUL。

weixin_44098461的博客 1805

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

c语言<string.h>库函数的模拟实现

strstr,strtok,strncmp,strcat,strncat,strcpy,strncpy的模拟实现

vantasy的博客 641

C语言当中头文件<string.h>当中一些库函数的拟实现

C语言当中头文件<string.h>当中一些库函数的拟实现

2301_80205070的博客 1159

c语言string函数的用法_string.h

string意思是字符串,也就是字符串库。我们这里了解下string库的几个重要函数并且实现.strlen() 求字符串长度;strcmp() 字符串的比较strncpy() 字符串的复制;首先解释下求字符串的长度:strlen()的用法是,strlen(字符串),将会返回一个整数.首先重点:只能是字符串。strlen的实现int strlen(char *p){int l...

weixin_39585974的博客 1497

常用字符串库函数总结

本文转自https://blog.csdn.net/sharon_1987/article/details/50022855 本文与原文内容没有差别,但是由于本人比较注重颜值还有阅读体验(自认为这样可能阅读起来会舒服点),就...又给排版了一下,也算参与博客创作了(重在参与重在参与); 本文主要是粗略的介绍了各个字符库函数的大致用法,总结感觉也挺详细,就分享给诸位,有许多说明不明确,如果相要详细理解,可以在博客搜索,后续有些可能我可能也会写博客总结,到时候会附上链接,有些可能会存在错误,望大佬们指出;.

Aurox_的博客 1323

c语言第三方字符串库,【开源共享】拿来即用的C语言字符串函数库

一、字符串函数库:Simple Dynamic Strings1. 简介Simple Dynamic Strings (简称 SDS) 是一个 C 语言字符串库,它增强了 C 语言字符串处理的能力。设计 SDS 原本是为了满足设计者自身日常的 C 编程,后来又被转移到 Redis 中,在 Redis 中被广泛使用并对其进行了修改以适合于高性能操作。现在,它又被从 Redis 中提取出来的,并 fo...

weixin_31655833的博客 1183

C语言高级专题(11)------- 常见字符串库函数

举例:字符串库函数 1、什么是字符串 (1)字符串就是由多个字符在内存中连续分布组成的字符结构。字符串的特点是指定了开头(字符串的指针)和结尾(结尾固定为字符’\0’),而没有指定长度(长度由开头地址和结尾地址相减得到) 2、为什么要讲字符串处理函数 (1)函数库为什么要包含字符串处理函数?因为字符串处理的需求是客观的,所以从很早开始人们就在写很多关于字符串处理的函数,然后逐渐形成了现在的字符串处理函数库。 (2)面试笔试时,常用字符串处理函数也是经常考到的点。 3、常用字符串处理函数 (1)C库中字符串处

big_C的博客 665

C/C++ 对常见字符串库函数的实现

在c中的string.h头文件中存在很多对字符串进行操作的函数,利用这些函数可以方便的对字符串进行操作。下面将对常见的字符串函数进行解释和实现。strcpy 函数原型:char* _strcpy(char* dest,char* src) 函数功能:将str所指由nullptr的字符串复制到dst所指的数组中,并返回dest的指针。 函数说明:保证src和dest所指内存区域不能重叠且

lyl_312的博客 1644

.net mvc actionresult 返回字符串_C开发实战-实战字符串库函数

C语言的字符串库函数定义在头文件string.h中,在使用字符串库函数之前应该先使用#include 包含在源文件中。字符串复制字符串的复制,主要是将一个字符串复制到另外一个字符串中,因为字符串常量默认是以’0‘字符结尾,因此复制时包含'0'。C语言提供了strcpy()函数完成字符串的复制,参数传递两个字符串的地址即可。#define _CRT_SECURE_NO_WARNINGS#includ...

weixin_39795284的博客 246

传递字符串_C开发实战-实战字符串库函数

C语言的字符串库函数定义在头文件string.h中,在使用字符串库函数之前应该先使用#include 包含在源文件中。字符串复制字符串的复制,主要是将一个字符串复制到另外一个字符串中,因为字符串常量默认是以’0‘字符结尾,因此复制时包含'0'。C语言提供了strcpy()函数完成字符串的复制,参数传递两个字符串的地址即可。#define _CRT_SECURE_NO_WARNINGS#includ...

weixin_42552716的博客 379

string.h

本记为观看B站上 C/C++ 算法竞赛语法课『录制·纯享版』后的学习笔记。如有错误欢迎指正。

weixin_64048829的博客 600

C语言字符函数和字符串函数

字符函数和字符串函数是用来处理单个字符和字符数组(通常作为字符串处理)的标准库函数。这些函数有各种功能,如字符检查(例如是否为字母、数字等)、转换(大写、小写转换)以及字符串的操作(比较、复制、连接等)。

TENET123的博客 1137
上一篇: [C语言]带你详细了解C语言中数据的存储
下一篇: [C语言]结构体大小计算——你的心到底够不够装下我
FlashRider
博客等级 码龄4年 529粉丝 24原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值