C 字符串操作

server/2024/11/14 9:08:14/

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));
}


http://www.ppmy.cn/server/121781.html

相关文章

2024最新Linux发行版,Kali Linux迎来劲敌,零基础入门到精通,收藏这一篇就够了

概念简介 Parrot OS 是一款基于 Debian 的 Linux 发行版&#xff0c;专门为安全研究、渗透测试、开发以及隐私保护而设计。由 Frozenbox 团队开发的 Parrot OS&#xff0c;结合了现代安全工具、用户友好的环境以及出色的隐私保护特性&#xff0c;成为网络安全从业者、开发人员…

2024.9.24 Python与C++面试八股文

1.extern extern关键字用于在多个文件中引用同一个全局变量的声明 在一个头文件中&#xff0c;如果这个变量声明了&#xff0c;但是在cpp文件中没找到他的定义&#xff0c;那么编译就会报错&#xff0c;但是如果加了extern&#xff0c;编译器就不会给头文件报错&#xff0c;而…

中序遍历二叉树全过程图解

文章目录 中序遍历图解总结拓展&#xff1a;回归与回溯 中序遍历图解 首先看下中序遍历的代码&#xff0c;其接受一个根结点root作为参数&#xff0c;判断根节点是否为nil&#xff0c;不为nil则先递归遍历左子树。 func traversal(root *TreeNode,res *[]int) {if root nil …

【数据库】sqlite

文章目录 1. 基本概述2. 主要特点3. 应用场景4. 优缺点5. 基本使用示例6. 在编程语言中的使用连接到 SQLite 数据库&#xff08;如果文件不存在会自动创建&#xff09;创建表插入数据提交事务查询数据关闭连接 7. 总结 SQLite 是一个轻量级的关系型数据库管理系统&#xff08;R…

linux 下的静态库与动态库

目录 一、介绍 1、静态库 2、动态库 二、操作 1、静态库 2、动态库 3、使用库文件 &#xff08;1&#xff09;方法一 &#xff08;2&#xff09;方法二 &#xff08;3&#xff09;方法三 一、介绍 1、静态库 静态链接库实现链接操作的方式很简单&#xff0c;即程序文…

JAVA同城生活新引擎外卖跑腿团购到店服务多合一高效系统小程序源码

&#x1f680;同城生活新风尚&#xff01;一站式高效系统&#xff0c;让日常更便捷&#x1f6cd;️ &#x1f37d;️【开篇&#xff1a;同城生活&#xff0c;一触即发】&#x1f37d;️ 在这个快节奏的时代&#xff0c;同城生活的便利性与效率成为了我们追求的新风尚。想象一下…

5个月的编程记录

不知不觉间&#xff0c;我已经在计算机这条道路上走过了五个月。从五个月前第一次翻开《C Primer Plus》开始&#xff0c;我便对编程产生了浓厚的兴趣。这门学科与我高中所学的死板知识截然不同&#xff0c;每个问题都有千变万化的解法&#xff0c;让我感到无比新鲜。 几天后&a…

Linux 简易shell编写

shell shell是壳&#xff0c;外壳的意思&#xff0c;一般我们使用linux系统有用图形化界面的也有使用命令行界面的&#xff0c;这两个都是一种shell&#xff0c;以命令行为例&#xff1a; 如图这个就是我这里的命令行格式&#xff0c;在$符后面写的就是执行的指令&#xff0c;…