C语言strlen函数的缺陷与实现,strcpy函数的缺陷与实现,strcat函数的缺陷与实现,strcmp的实现。

news2024/9/27 19:18:02

1.strlen

函数原型:

size_t strlen( const char *string );
  • size_t 是无符号整型,相当于unsigned int
  • const char *string 是目标字符串

函数作用: 计算字符串的长度。

函数的模拟实现:

size_t _strlen(const char * str) {
	assert(str);
	int count = 0;
	while (*str) {
		count++;
		str++;
	}
	return count;
}

strlen函数的缺陷: 函数返回值是 size_t 所以有时候会发生一些意想不到的结果。

#include <stdio.h>
#include <string.h>
int main() {
	int i = -1;
	char str[] = "abcd";
	if (strlen(str) > i) {
		printf("YES\n");
	}
	else {
		printf("NO\n");
	}
	
	return 0;
}

以上这段代码 strlen 算出来结果很明显是 4 ,用 4i变量 去进行比较,那结果肯定是输出 YES。但是由于 strlen 返回的是无符号整数,所以这里会发生算术转换(自动类型转换),那么算术转换就会把 -1 转换为无符号整数,-1 的补码是全 1 转换成无符号数是一个非常大的整数。所以最后的结果是 NO

在这里插入图片描述


2.strcpy

函数原型:

char *strcpy( char *strDestination, const char *strSource );
  • char *strDestination 是目标字符串的起始地址
  • const char *strSource 是源字符串(需要拷贝过去的字符串)
  • char *strcpy 拷贝结束后,返回目标字符串的起始地址,方便函数的链式访问

函数作用: 拷贝字符串。

函数的模拟实现:

char* _strcpy(
	char * dest, 
	const char * src
) {
	assert(dest && src);

	char* temp = dest;

	while (*dest++ = *src++);

	return temp;
}

strcpy函数的缺陷:

1.strcpy拷贝的时候会拷贝 '\0',所以源字符串中必须有 '\0',如果没有'\0'会造成strcpy越界访问。
2.目标字符串的空间必须要比源字符串的空间大,否则会造成程序异常崩溃。


3.strcat

函数原型:

char *strcat( char *strDestination, const char *strSource );
  • char *strDestination 是目标字符串的起始地址
  • const char *strSource 是源字符串(需要追加上去字符串)
  • char *strcat 追加结束后,返回目标字符串的起始地址,方便函数的链式访问

函数作用: 追加字符串。

函数的模拟实现:

char* _strcat(
	char* dest,
	const char* src
) {
	assert(dest && src);

	char* temp = dest;

	while (*dest) {
		dest++;
	}

	while (*dest++ = *src++);

	return temp;
}

strcat函数的缺陷:

1.strcat追加的时候会追加 '\0',所以源字符串中必须有 '\0',如果没有'\0'会造成strcat越界访问。
2.目标字符串中也要有'\0',因为strcat是从目标字符串'\0'的位置开始追加。
3.目标字符串的空间必须要比源字符串的空间大,否则会造成程序异常崩溃。
4.strcat不可以追加同一个字符串。


4.strcmp

函数原型:

int strcmp( const char *string1, const char *string2 );
  • const char *string1 是第一个字符串的起始地址

  • const char *string2 是第二个字符串的起始地址

  • int strcmp 返回一个整型

    • > 0 说明第一个字符串大于第二个字符串
    • < 0 说明第一个字符串小于第二个字符串
    • = 0 说明两个字符串相等

函数作用: 判断字符串是否相等。

函数的模拟实现:

int _strcmp(
	const char* string1, 
	const char* string2
) {
	assert(string1 && string2);
	while ( (*string1 == *string2) && (*string1) && (*string2) ) {
		string1++;
		string2++;
	}

	return *string1 - *string2;
}

int main() {

	char str1[] = "abcdf";
	char str2[] = "abcdf";
	printf("%d" , _strcmp(str1 , str2));

	return 0;
}

在这里插入图片描述

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

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

相关文章

地址解析省市区详细地址

项目代码源地址在我的github&#xff1a;https://github.com/weitw/address-analyzer 一、项目介绍 1、解析规则 将一个用户输入的地址&#xff0c;解析成省、市、区、详细地址的形式。 如果用户输入的不是标准的地址&#xff0c;则需要推测标准地址。例如用户输入&#xff…

【AIGC】16、Vision-Language 模型在视觉任务中的调研

文章目录 一、简介二、基础知识2.1 视觉任务的训练策略2.2 VLM 基础2.2.1 网络结构2.2.2 预训练目标函数2.2.3 评估和下游任务 2.3 数据集 三、迁移学习3.1 使用 prompt tuning 实现迁移学习3.2 通过特征适应来进行迁移学习 四、VLM 的知识蒸馏4.1 目标检测的知识蒸馏4.2 语义分…

用雪花 id 和 uuid 做 MySQL 主键,被领导怼了

在MySQL中设计表的时候&#xff0c;MySQL官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一)&#xff0c;而是推荐连续自增的主键id&#xff0c;官方的推荐是auto_increment&#xff0c;那么为什么不建议采用uuid&#xff0c;使用uuid究竟有什么坏处&#xff1f;本篇…

打造专属封面!这两款神器必备

无论你是图文博主还是视频博主&#xff0c;做封面都是必不可少的。谈及可制作封面的工具&#xff0c;种类是极其繁多的&#xff0c;比如黄油相机、美图秀秀、美易等。虽然这些工具各有千秋&#xff0c;但我不建议使用&#xff0c;因为它们的某个功能可能做得不错&#xff0c;但…

【MySQL数据库 | 第十九篇】SQL性能分析工具

目录 前言&#xff1a; SQL执行频率&#xff1a; 慢查询日志&#xff1a; profile&#xff1a; profile各个指令&#xff1a; 总结&#xff1a; 前言&#xff1a; 本篇我们将为大家讲解SQL性能的分析工具&#xff0c;而只有熟练的掌握了性能分析的工具&#xff0c;才可以更…

JVM知识点整理

JVM 回收哪个区域&#xff1f;关联面试题&#xff1a;fullgc会回收方法区&#xff08;元空间&#xff09;吗? 怎么判断对象可以被回收了关联面试题&#xff1a;哪些对象可以作为 GC Root &#xff08;两栈两方法&#xff09; JVM GC什么时候执行&#xff1f;分代回收机制思考&…

pandas---文件读取与存储(csv、hdf、json、excel、sql)

数据大部分存在于文件当中&#xff0c;所以pandas会支持复杂的IO操作&#xff0c;pandas的API支持众多的文件格 式&#xff0c;如CSV、SQL、EXCEL、JSON、 HDF5。 1. csv文件 pandas.read_csv(filepath_or_buffer, sep ,, usecols ) filepath_or_buffer:文件路径 sep :…

简要介绍 | 强化学习:从原理到应用

注1&#xff1a;本文系“简要介绍”系列之一&#xff0c;仅从概念上对强化学习进行非常简要的介绍&#xff0c;不适合用于深入和详细的了解。 注2&#xff1a;"简要介绍"系列的所有创作均使用了AIGC工具辅助 强化学习&#xff1a;从原理到应用 1. 背景介绍 强化学习…

手撕学生管理系统超详解——【c++】

题目要求&#xff1a;设计一个学生成绩管理程序&#xff0c;实现按班级完成对学生成绩信息的录入和修改&#xff0c;并用文件保存。 实现按班级输出学生的成绩单;实现按学号和姓名进行查询&#xff0c;按平均成绩进行排序功能。 问题描述 该程序的目标是提供一个简单且易于使用…

scratch lenet(2): C语言实现图像直方图的计算

scratch lenet(2): C语言实现图像直方图的计算 1. 目的 用 C 语言实现 uint8 类型图像&#xff08;单通道&#xff09;的直方图计算。不涉及直方图均衡化。 2. 什么是图像直方图 2.1 统计得到图像直方图 通常是对于单通道的灰度图而言的。像素范围是 [0, 255], 统计每个像…

提高错误日志处理效率!使用Python和钉钉机器人实现自动告警聚合

1、背景 日志是非常重要的信息资源。它们记录了应用程序的运行状态、错误和异常情况&#xff0c;帮助我们了解系统的健康状况以及发现潜在的问题。为了高效地管理和分析日志数据&#xff0c;许多组织采用了Elasticsearch、Logstash和Kibana&#xff08;ELK&#xff09;堆栈作为…

Eclipse Krazo(Jakarta MVC)的使用

文章目录 背景Jakarta MVC规范Eclipse Krazo使用前的思考全局配置Controller示例返回View的三种写法View中用到的Model如何设值&#xff1f;View中如何获取Model中的值&#xff1f; 参数校验防止CSRFKrazo是如何实现的呢&#xff1f;如何生成csrf的token&#xff1f;如何校验cs…

开源赋能,决胜未来 — 参加原子全球开源峰会有感

目录 文章目录 目录前言开源决胜未来&#xff1a;闭源摧毁 UNIX&#xff0c;开源成就 Linux开源创新&#xff1a;软硬件协同&#xff0c;共建开源生态 前言 开源原子基金会作为国内首家开源基金会组织&#xff0c;由其主办的首届 “开放原子全球开源峰会” 也是第一次被冠以 “…

干货文:Mac 中 .bash_profile 和 .zshrc 的区别

如果你想在 Mac OS 中配置 MySQL 的环境变量&#xff0c;在 .zshrc 文件中添加如下内容&#xff1a; # 设置 mysql 的路径 export MYSQL_HOME/usr/local/mysql/bin# 将 MYSQL_HOME 添加到 PATH 中 export PATH$HOME/bin:/usr/local/bin:$MYSQL_HOME:$PATH# 解决需要 source 才…

硬件【9】详解二极管钳位电路

文章目录 1 概述1.1 正向钳位电路1.2 偏置正向钳位电路 1 概述 在之前的 二极管限幅电路 一文中&#xff0c;我们学习了二极管限幅电路&#xff0c;该电路可以削掉一部分信号&#xff0c;但不会影响剩余信号。今天&#xff0c;我们将学习另一种基于二极管的电路&#xff0c;该…

搭建环境【2】windows主机和ubuntu互传文件的4种方法

我的ubuntu系统是安装在 VMware 虚拟机中的&#xff0c;两者之间经常要互传文件&#xff0c;下面介绍4种常用的互传文件方法。 1. 共享文件夹方式互传 在虚拟机中需要开启共享文件夹的功能。首先虚拟机中的ubuntu要求是已经开机了的状态&#xff0c;然后进行设置&#xff1a;…

Vue2封装一个全局通知组件并发布到NPM

✍&#x1f3fc;作者&#xff1a;周棋洛&#xff0c;计算机学生 ♉星座&#xff1a;金牛座 &#x1f3e0;主页&#xff1a;点击查看更多 &#x1f310;关键&#xff1a;vue2 组件封装 npm发包 文章目录 1. 前言 &#x1f343;2. 我为什么要封装通知插件 ❓3. 初始化vue空项目 &…

B047-cms02-高级查询 删除 添加 修改

目录 高级查询页面准备下拉框显示文章类型ArticleController用jstl和el表达式取值展示 高级查询参数ArticleQuery 高级查询页面发送请求导入jquery.jdirk.js在jquery下引用绑定按钮发送请求高级查询sql 绑定删除事件绑定事件拿到标签id值准备模态框来自xmind弹出删除模态框绑定…

matlab不显示子图刻度并调整子图间距

matlab中在使用subplot函数画图时&#xff0c;尤其是做emd分解查看IMF时&#xff0c; 正常画图的代码及结果如下&#xff1a; figure for i 1:size(imf_norm,1)subplot(7,1,i)plot(imf_norm(i,:))ylabel(IMFstring(i)) end其中imf_norm为分解得到的imfs 效果图&#xff1a; …

python里apply用法_Python apply函数的用法

Python编程语言Python 是一种面向对象、解释型计算机程序设计语言&#xff0c;由Guido van Rossum于1989年底发明&#xff0c;第一个公开发行版发行于1991年。Python语法简洁而清晰&#xff0c;具有丰富和强大的类库。它常被昵称为胶水语言&#xff0c;它能够把用其他语言制作的…