C 字符串操作

strcpy

char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest。 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>char* my_strcpy(char *dst, char *src)
{if(dst == NULL || src == NULL){return NULL;}char *ret = dst;while((*dst++ = *src++) != '\0');return ret;
}int main()
{char src[10];scanf("%s", &src);char *dst = malloc(sizeof(src));dst = my_strcpy(dst, src);printf("%s", dst);
}

mempcy

- 增加内存重叠检测,避免dst与src重叠时(即dst>=src && dst <= src+strlen(src)),src的尾'\0'被覆盖,报错。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>char* my_memcpy(char *dst, const char* src, int num)
{if(dst == NULL || src == NULL) return NULL;char *ret = dst;// dst 与 src 内存重叠 : 从高地址开始复制if(dst >= src && dst <= src + num){dst = dst + num - 1;src = src + num - 1;while(num--){*dst-- = *src--;}}// dst 与 src 无内存重叠 : 从地址开始复制else{while(num--){*dst++ = *src++;	}}return ret;
}char* my_strcpy(char *dst, const char *src)
{if(dst == NULL || src == NULL){return NULL;}return my_memcpy(dst, src, strlen(src)+1);
}int main()
{char src[3];scanf("%s", &src);my_strcpy(src+1, src);printf("%s", src);
}

- void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1。 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>void* my_memcpy(void *dst, const void* src, size_t num)
{if(dst == NULL || src == NULL) return NULL;void *ret = dst;// dst 与 src 内存重叠 : 从高地址开始复制if(dst > src && (char*)dst < (char*)src + num){dst = (char*)dst + num - 1;src = (char*)src + num - 1;while(num--){*(char*)dst-- = *(char*)src--;}}// dst 与 src 无内存重叠 : 从地址开始复制else{dst = (char*)dst;src = (char*)src;while(num--){*(char*)dst++ = *(char*)src++;	}}return ret;
}char* my_strcpy(char *dst, const char *src)
{if(dst == NULL || src == NULL){return NULL;}return my_memcpy(dst, src, strlen(src)+1);
}int main()
{/*char src[3];scanf("%s", &src);my_strcpy(src+1, src);printf("%s", src);*/int src[3];for(int i=0; i<3; i++){scanf("%d", &src[i]);	}my_memcpy(src+1, src, sizeof(int)*2);for(int i=0; i<3; i++){printf("%d ", src[i]);}}

 strcat

 char *strcat(char *dest, const char *src) 把 src 所指的字符串追加到 dest 所指向的字符串的结尾 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>char* strcat(char* dst, const char* src)
{if(dst == NULL || src == NULL) return NULL;//char *ret = dst;while(*dst != '\0'){dst++;}while((*dst++ = *src++) != '\0');return ret;
}int main()
{char src[3];fgets(src, 3, stdin);//scanf("%s",&src);char dst[12] = "capybara_";printf("%s", strcat(dst, src));
}

strlen

#include <stdio.h>
#include <assert.h>
size_t my_strlen(char *str)
{if(str == NULL) return 0;//assert(str != NULL);size_t res = 0;while(*str != '\0'){res++;str++;}return res;
}
int main()
{/*  Write C code in this online editor and run it. */printf("Hello, World! \n");//char *str = "hi";char *str=NULL;printf("%d",my_strlen(str));return 0;
}

strcmp

 int strcmp(const char *str1, const char *str2) 按字典序比较字符串str1,str2

  • 如果返回值小于 0,则表示 str1 小于 str2。
  • 如果返回值大于 0,则表示 str1 大于 str2。
  • 如果返回值等于 0,则表示 str1 等于 str2。
#include <stdio.h>
#include <assert.h>int my_strcmp(const char *str1, const char *str2)
{assert(str1 != NULL && str2 != NULL);while( *str1  && *str2 ){if(*str1 != *str2){break;}str1++;str2++;}return *str1 - *str2;
}int main()
{/*  Write C code in this online editor and run it. */printf("Hello, World! \n");char *str1 = "hi";char *str2 = "hii";printf("%d", my_strcmp(str1, str2));return 0;
}

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

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

相关文章

828华为云征文|华为云Flexus云服务器X实例部署——盲盒抽奖商城系统以及编译发布小程序

盲盒抽奖商城系统使用 thinkphp6.0 uniapp 开发&#xff0c;做到了全移动端兼容。一个系统不仅可以打包 小程序 还可以 打包APP &#xff0c;H5 华为云Flexus云服务器X实例在安装搭建盲盒商城小程序方面具有显著优势&#xff0c;这些优势主要体现在以下几个方面&#xff1a; …

安卓13删除下拉栏中的关机按钮版本2 android13删除下拉栏关机按钮

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 顶部导航栏下拉可以看到,底部这里有个设置按钮,点击可以进入设备的设置页面,这里我们将更改为删除,不同用户通过这个地方进入设置。我们之前写过一个文章也是一样的删除…

数据结构之链表(2),双向链表

目录 前言 一、链表的分类详细 二、双向链表 三、双向链表的实现 四、List.c文件的完整代码 五、使用演示 总结 前言 接着上一篇单链表来详细说说链表中什么是带头和不带头&#xff0c;“哨兵位”是什么&#xff0c;什么是单向什么是双向&#xff0c;什么是循环和不循环。然后实…

数据结构-栈(理解版)

一、栈的定义 相信大家对于栈或多或少有一些了解&#xff0c;可能大多数人会告诉你栈是一种先进后出的数据结构。这其实说了跟没说一样(❁◡❁)&#xff01;当然&#xff08;last in&#xff0c;first out&#xff09;是栈最有特色的性质。 这里可以给大家一些比较好理解的例…

大模型增量训练--基于transformer制作一个大模型聊天机器人

针对夸夸闲聊数据集&#xff0c;利用UniLM模型进行模型训练及测试&#xff0c;更深入地了解预训练语言模型的使用方法&#xff0c;完成一个生成式闲聊机器人任务。 项目主要结构如下&#xff1a; data 存放数据的文件夹 dirty_word.txt 敏感词数据douban_kuakua_qa.txt 原始语…

sqlserver迁移数据库文件存储位置

业务背景&#xff1a;由于C盘爆满&#xff0c;需要将数据库文件迁移到别处比如D盘 下面以某一个数据库转移为示例&#xff1a;&#xff08;可以用SSMS工具&#xff0c;新建查询配合使用&#xff09; 1.查询数据库文件存储路径 sql语句&#xff1a; -- 查询路径 USE QiangTes…

HarmonyOS/OpenHarmony 离线加载web资源,并实现web资源更新

关键词&#xff1a;h5离线包加载、h5离线包更新、沙箱 在上一篇文章中&#xff0c;我们已经介绍了如何将 rawfile 资源文件中的文件数据拷贝到沙箱下&#xff0c;那么该篇文章将介绍如何加载该沙箱目录下的文件资源&#xff08;此处以打包后的web资源为例&#xff09;&#xf…

Android 12系统源码_输入系统(三)输入事件的加工和分发

前言 上一篇文章我们具体分析了InputManagerService的构造方法和start方法&#xff0c;知道IMS的start方法经过层层调用&#xff0c;最终会触发Navite层InputDispatcher的start方法和InputReader的start方法。InputDispatcher的start方法会启动一个名为InputDispatcher的线程&…

linux驱动编程——等待队列

一、等待队列 可实现调用read函数时阻塞等。 1、流程 &#xff08;1&#xff09;初始化等待队列头&#xff08;带参宏&#xff09; init_waitqueue_head(q) 等待队列头wq数据类型&#xff1a; wait_queue_head_t&#xff0c;等待条件condition&#xff1a;int型变量。 &…

(c++)内存四区:1.代码区2.全局区(静态区)3.栈区4.堆区

//内存四区&#xff1a;1.代码区 2.全局区 3.栈区 4.堆区 1.放在代码区的有&#xff1a;1.写的代码&#xff1a;只读的、共享的、存放的二进制机器指令、由操作系统直接管理 2.放在全局区的有&#xff1a;1.全局的&#xff08;变量或常量&#xff09; 2.静态的&#xff0…

6种MySQL高可用方案对比分析

大家好&#xff0c;我是 V 哥&#xff0c;关于 MySQL 高可用方案&#xff0c;在面试中频频出现&#xff0c;有同学在字节面试就遇到过&#xff0c;主要考察你在高可用项目中是如何应用的&#xff0c;V 哥整理了6种方案&#xff0c;供你参考。 MySQL的高可用方案有多种&#xf…

rdp远程桌面服务协议概述

rdp远程桌面服务协议概述 什么是远程桌面服务远程桌面服务的通信过程及功能 建立连接资源重定向与用户体验断开连接 远程桌面服务的协议架构 核心协议与基础通信虚拟通道与扩展协议协议协作与层次划分协议的可扩展性协议扩展与性能优化 总结参考 rdp远程桌面服务协议概述 对于…

SpringBoot(Java)实现MQTT连接(本地Mosquitto)通讯调试

1.工作及使用背景 工作中需要跟收集各种硬件或传感器数据用于Web展示及统计计算分析&#xff0c;如电表、流量计、泵、控制器等物联网设备。 目前的思路及解决策略是使用力控或者杰控等组态软件实现数据的转储&#xff08;也会涉及收费问题&#xff09;&#xff0c;通过组态软件…

鸿蒙开发(NEXT/API 12)【应用间消息通信】手机侧应用开发

在手机侧与穿戴设备侧构建应用到应用的通信隧道&#xff0c;用于收发应用自定义的报文消息以及文件。实现手机应用和穿戴设备应用间的交互&#xff0c;为用户提供分布式场景和体验。比如手机应用发送音频文件到穿戴设备侧应用&#xff0c;实现在穿戴设备侧应用上播放音乐&#…

php函数安全漏洞的挖掘与修复技巧

PHP 函数安全漏洞的挖掘与修复技巧 简介 PHP 函数中经常存在安全漏洞&#xff0c;例如 SQL 注入和跨站脚本攻击 (XSS)。了解如何挖掘和修复这些漏洞对于确保 Web 应用程序的安全性至关重要。 漏洞挖掘 以下是挖掘 PHP 函数安全漏洞的一些技巧&#xff1a; 参数检查&#xf…

BUG——IMX6ULL编译正点原子Linux内核报错

最初编译的是正点原子改过的Linux内核&#xff0c;可能是版本问题&#xff0c;一直报错&#xff0c;无法成功编译。然后换成NXP官方Linux内核6.6版本&#xff0c;初始编译虽然也报各种错&#xff0c;但都是缺少库或相关工具&#xff0c;全部安装后就可以成功编译出镜像了&#…

Leetcode 740. 删除并获得点数

原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 给你一个整数数组 nums &#xff0c;你可以对它进行一些操作。 每次操作中&#xff0c;选择任意一个 nums[i] &#xff0c;删除它并获得 nums[i] 的点数。之后&#xff0c;你必须删除 所有 等于 nums[i] - 1 和…

cscode搭建vue项目

创建前安装环境 ctrlj弹出终端 window需要管理员运行并且授权 node -v # 显示版本号&#xff0c;说明 node 已经装好 npm -v # 显示版本号&#xff0c;说明 npm 可以使用 # 安装cnpm npm install -g cnpm --registryhttps://registry.npm.taobao.org cnpm -v # 显示版本号&a…

Spring中如何为静态变量注入值

在 Spring 中&#xff0c;如果使用 Value 注解注入值&#xff0c;不能将其应用于 static 字段。Spring 只能为实例变量注入值&#xff0c;不能直接对静态变量进行注入。 使用 PostConstruct 初始化&#xff1a; 如果确实需要在静态上下文中使用该值&#xff0c;可以使用 Post…

机器学习(1)——线性回归、线性分类与梯度下降

文章目录 线性回归线性分类线性可分数据线性不可分数据逻辑回归支持向量机 梯度下降批量梯度下降随机梯度下降批量随机梯度下降 线性回归 概述&#xff1a; 在一元线性回归中&#xff0c;我们假设目标变量y与特征变量x存在线性关系&#xff0c;模型表达式为&#xff1a; y …