C语言字符串函数

1.strlen函数

size_t strlen( const char *str );

例:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>int main()
{char arr[] = "asdfgh";size_t len = strlen(arr);printf("%zd\n", len);return 0;
}

strlen函数的返回类型是size_t

而无符号整形 - 无符号整形的结果还是无符号整形

2.模拟strlen函数的另一种方法(不使用临时变量):

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>size_t my_strlen(const char* p)//递归
{assert(p != NULL);if (*p != '\0'){return 1 + my_strlen(++p);}else{return 0;}}
//不允许用临时变量的话可以考虑用递归int main()
{char arr[] = "asdfgh";size_t len = my_strlen(arr);printf("%zd\n", len);return 0;
}

3.strcpy函数

char *strcpy( char *strDest, const char *strSour );

后边拷到前边

返回的是strDest指向的地址

会自动补上\0,此意即~

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>int main()
{char arr1[] = "asdfgh";char arr2[30] = "****************";strcpy(arr2, arr1);printf("%s\n", arr2);//输出asdfghreturn 0;
}

~即将arr1完全地放入arr2中

该函数会一直找arr1的\0再将前边的内容存入arr2中

注:常量字符串不可修改

且:

源字符串必须以'/0'结束
目标空间必须足够大,以确保能存放源字符串
目标空间必须可修改

4.空指针本身就为假

5.模拟实现strcpy

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>char* my_strcpy(char* arr1, const char* arr2)
{assert(arr1 != NULL && arr2 != NULL);size_t len = strlen(arr2);int i = 0;for (i = 0; i < len; i++){arr1[i] = arr2[i];}return arr1;
}int main()
{char arr2[] = "asdfgg";char arr1[30] = { 0 };my_strcpy(arr1, arr2);printf("%s\n", arr1);return 0;
}

6.NULL本质也是0

文档里的nul和NUL就是\0

7.strcat函数

 char *strcat( char *strDest, const char *strSour );

后追加到前

返回的是前边字符串的起始地址

也是完全地将后边的/0传过去

目标字符串中也得有/0,否则没办法知道追加从哪里开始.
目标空间必须有足够的大,能容纳下源字符串的内容.
目标空间必须可修改.
用这个函数,字符串自己不能给自己追加

所以不要用strcat给自己追加字符串

模拟实现:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>char* my_strcat(char* dest, const char* src)
{int i = 0;while (*(dest + i) != '\0'){i++;}//出来后i就找到了dest的\0的位置//开始更换int j = 0;while (*(src + j) != '\0'){*(dest + i) = *(src + j);j++;i++;}*(dest + i) = *(src + j);return dest;
}int main()
{char arr1[30] = "Hello";char arr2[] = "World";my_strcat(arr1, arr1);printf("%s\n", arr1);return 0;
}

8.strcmp函数

int strcmp( const char *str1, const char *str2 );

strcmp的模拟实现:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>int my_strcmp(const char* str1, const char* str2)
{assert(str1 != NULL && str2 != NULL);while (*str1 == *str2 && *str2 != '\0'){str1++;str2++;}if (*str1 > *str2){return 1;}else if (*str1 < *str2){return -1;}else{return 0;}}int main()
{printf("%d\n", my_strcmp("aafg", "aafg"));return 0;
}

9.%???中,???之间只要有d就是打印有符号数,???之间只要有u就是打印无符号数

10.

strncpy函数

char *strncpy( char *Dest, const char *Src, size_t count );

复制完成之后是可以不放\0进去的

即你让我拷贝几个我就拷贝几个(绝对)

不够的话我就在后边补上\0

strncmp

int strncmp( const char *str1, const char *str2, size_t count );

加上count后函数就会给你比较前count个字符的大小,别乱搞

strncat函数

char *strncat( char *Dest, const char *Src, size_t count );

他会给你默认在后边追加上一个\0(会多追加一个\0)

count超出那个要追加的字符串长度时,追加完成后加上\0,函数就跑路了,不会给你加上更多的\0

11.字符串自己给自己追加的时候用strncat最合适

12.strstr函数

char *strstr( const char *str1, const char *str2);

在前边那个字符串当中找后边那个字符串的位置,如果有,则返回后边那个字符串在前边那个字符串中 第一次 出现的地址,没找到则返回NULL

13.strstr的模拟实现:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>char* my_strstr(const char* str1, const char* str2)
{while(1){while (*str1 != *str2){if (*str1 == '\0' || *str2 == '\0'){return NULL;}str1++;}//出来设好重生点char* s1 = str1;char* s2 = str2;while (*s1 == *s2){s1++;s2++;if (*s2 == '\0'){return str1;}if (*s1 == '\0'){return NULL;}}str1++;}
}int main()
{char* a = "abcdef";char* b = "bcq";char* ret = my_strstr(a, b);printf("%s\n", ret);return 0;
}

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

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

相关文章

Mysql常用SQL语句

导出指定表 mysqldump --no-create-info -uroot -proot test book book_chapter book_chapter_item > book.sql 导出数据库&#xff0c;排除某几个表 /usr/local/mysql/bin/mysqldump -uroot -proot --ignore-tableshiji.log shiji > /data/shiji/db/shiji.sql 统计所…

【Linux进阶之路】线程

文章目录 一、初始线程1.概念2.执行3.调度4.切换 二、线程控制1.创建2.等待3.分离4.退出5.取消 三、线程安全1.互斥1.1初始1.2理解1.3锁1.3.1概念1.3.2原理1.3.4死锁 2.同步2.1概念2.2原理 3.生产消费者模型 总结尾序 一、初始线程 1.概念 简单的概念&#xff1a; 线程就是一…

Linux环境安装Hadoop

&#xff08;1&#xff09;下载Hadoop安装包并上传 下载Hadoop安装包到本地&#xff0c;并导入到Linux服务器的/opt/software路径下 &#xff08;2&#xff09;解压安装包 解压安装文件并放到/opt/module下面 [roothadoop100 ~]$ cd /opt/software [roothadoop100 software…

opencv静态链接error LNK2019

opencv 3.1.0 静态库&#xff0c;包括以下文件 只链接opencv_world310d.lib&#xff0c;报错 opencv_world310d.lib(matrix.obj) : error LNK2019: 无法解析的外部符号 _ippicvsFlip_16u_I8&#xff0c;该符号在函数 "enum IppStatus (__stdcall*__cdecl cv::getFlipFu…

嵌入式中断理解

一、概念 中断&#xff1a; 在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&#xff0c;处理完成后又返回原来被暂停的位置继续运行。 中断优先级&#x…

大型医院PACS系统源码,影像存储与传输系统源码,支持多种图像处理及三维重建功能

PACS系统是医院影像科室中应用的一种系统&#xff0c;主要用于获取、传输、存档和处理医学影像。它通过各种接口&#xff0c;如模拟、DICOM和网络&#xff0c;以数字化的方式将各种医学影像&#xff0c;如核磁共振、CT扫描、超声波等保存起来&#xff0c;并在需要时能够快速调取…

springboot使用poi-tl动态填充word模板

第一、导入依赖 <!-- docx 数据填充生成 doc文件 这个是主要 --> <!-- POI --> <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version> </dependency> <depen…

C++11特性:共享智能指针

在C中没有垃圾回收机制&#xff0c;必须自己释放分配的内存&#xff0c;否则就会造成内存泄露。解决这个问题最有效的方法是使用智能指针&#xff08;smart pointer&#xff09;。智能指针是存储指向动态分配&#xff08;堆&#xff09;对象指针的类&#xff0c;用于生存期的控…

docker hub 上传笔记

近段时间刚好有相关需求上传docker到hub&#xff0c;顺便记录学习一下&#xff1a; 1. 构建指定版本&#xff0c;并上传 docker build --platformlinux/amd64 -f dockerfile_s01 -t myDocker . # 打标签&#xff0c;docker images的名字为myLocalDockerName docker tag myLoc…

机器学习 深度学习 神经网络

神经网络概念&#xff1a; 神经网络是一个由生物神经元组成的网络或电路&#xff0c;或者从现代意义上讲&#xff0c;是一个由人工神经元或节点组成的人工神经网络。因此&#xff0c;一个神经网络要么是由生物神经元组成的生物神经网络&#xff0c;要么是用于解决人工智能&…

pytorch——基于循环神经网络的情感分类

任务目标 基于给定数据集&#xff0c;进行数据预处理&#xff0c;搭建以LSTM为基本单元的模型&#xff0c;以Adam优化器对模型进行训练&#xff0c;使用训练后的模型进行预测并计算预测分类的准确率。 数据集信息 IMDB数据集是一个对电影评论标注为正向评论与负向评论的数据…

35_36-Golang 中的 go mod 以及 Golang 包详解

**Golang **中的 **go mod **以及 **Golang **包详解 主讲教师&#xff1a;&#xff08;大地&#xff09; 合作网站&#xff1a;www.itying.com** **&#xff08;IT 营&#xff09; 我的专栏&#xff1a;https://www.itying.com/category-79-b0.html 一、Golang 中包的介绍和…

Ubuntu 常用命令之 chown 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 chown 命令在 Ubuntu 系统中用于改变文件或目录的所有者和组。这个命令的基本格式是 chown [选项]... [所有者][:[组]] 文件...。 chown 命令的主要参数有 -c 或 --changes&#xff1a;类似 verbose&#xff0c;但只在发生改变时…

【产品经理】Axure原型工具教程

笔记为项目总结笔记&#xff0c;若有错误欢迎指出哟~ Axure原型工具教程 Axure简介原型图分类常用操作常用原件常用交互母版常用设备分辨率 Axure简介 Axure是一款专业的原型设计与交互设计软件&#xff0c;可以帮助用户快速创建高保真的原型和交互设计。Axure支持多种常见的交…

java8实现List中对象属性的去重

java8的stream流能完美解对象集合去重问题. Data AllArgsConstructor NoArgsConstructor Builder public class UserCar {private Integer id;private String carNo;public static void main(String[] args) {List<UserCar> cars new ArrayList<>();cars.add(Use…

关于Selenium的网页对象单元测试的设计模式

写在前面&#xff1a;经过了实践总结一下经验&#xff0c;心得进行一个分享。 首先driver是可以单独抽出来的&#xff0c;变成一个driver函数放在driver.py。 from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver…

【案例】图片预览

效果图 如何让图片放大&#xff0c;大多数的UI组件都带有这种功能&#xff0c;今天给大家介绍的这个插件除了放大之外&#xff0c;还可以旋转、移动、翻转、旋转、二次放大&#xff08;全屏&#xff09; 实现 npm i v-viewer -Smain.js 中引入 import viewerjs/dist/viewer.c…

【网络基础】网线制作集线器和交换机讲解路由设置

目录 一 网线制作 ● 由来 ● 材料&#xff08;4种&#xff09; ● 步骤 二 集线器和交换机 2.1 OSI七层模型概念 2.2 集线器与交换机简介 三 路由器设置 3.1 路由器概念 3.2 路由器设置管理登入 3.2.1 进路由器管理(新路由器) 3.2.2 进路由器管理(旧路由器) 四 全…

ROS笔记之rosbag的快速切片(C++实现)

ROS笔记之rosbag的快速切片(C实现) —— 杭州 2023-12-21 夜 code review 文章目录 ROS笔记之rosbag的快速切片(C实现)1.运行效果2.文件结构3.fast_rosbag_slice.cpp4.CMakeLists.txt5.package.xml6.对fast_rosbag_slice.cpp进行函数封装 正常该功能是ROS官方命令行&#xff1a…

C#合并多个Word文档(微软官方免费openxml接口)

g /// <summary>/// 合并多个word文档&#xff08;合并到第一文件&#xff09;/// </summary>/// <param name"as_word_paths">word文档完整路径</param>/// <param name"breakNewPage">true(默认值)&#xff0c;合并下一个…