【C语言】字符串函数

文章目录

  • 前言
    • 1.strcat
    • 2.strncpy
    • 3.strncat
    • 4.strncmp
    • 5.strstr
    • 6.strtok
    • 7.strerror
    • 8.strcat的模拟实现
    • 9.strstr的模拟实现
  • 总结


添加链接描述

前言

  大家好呀,今天给大家分享一下字符函数和字符串函数

C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在 常量字符串中或者字符数组 中.字符串常量 适用于那些对它不做修改的字符串函数

1、strcat
2、strncpy
3、strncat
4、strncmp
5、strstr
6、strtok
7、strerror
8、模拟实现strcat
9、模拟实现strstr

1.strcat

功能:可以在一个字符串后面追加字符
函数声明:char *strcat( char *strDestination, const char *strSource );
头文件:string.h
参数解释以及返回值解释:第一个参数接收被追加字符串数组的地址,第二个参数是追加的内容字符串数组,返回的是追加后字符串数组的地址

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "abcdef";char arr2[] = "gh";strcat(arr1, arr2);printf("%s", arr1);}

注意:源字符串必须以 ‘\0’ 结束。
目标空间必须有足够的大,能容纳下源字符串的内容。
目标空间必须可修改。

int main()
{char arr1[20] = "abcdef";char arr2[] = {'a','b','c'};strcat(arr1, arr2);printf("%s", arr1);
}

在这里插入图片描述
程序发生崩溃,arr2数组如果没有’\0’的话,他会在后面地址上找到\0,在追加到arr1数组的时候,会越界放不下
字符串strcat函数不能自己给自己追加

追加前:
在这里插入图片描述
追加后:
在这里插入图片描述
追加的时候把源数组中的‘\0’被追加字符所覆盖

2.strncpy

功能:拷贝num个字符从源字符串到目标空间
函数声明:char * strncpy ( char * destination, const char * source, size_t num );
头文件:string.h
参数:第一个参数为接收目标空间地址,第二个参数接收是源空间地址,返回参数是目标地址,size_t是无符号整数类型,num是拷贝字符的数目

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>
#include <string.h>int main()
{char arr1[40] = "hered ";char arr2[] = "ll";strncpy(arr1,arr2,2);printf("%s",arr1);
}

在这里插入图片描述

3.strncat

功能:追加num个字符从源字符串到目标空间。
声明:char * strncat ( char * destination, const char * source, size_t num );
头文件:string.h
参数:第一个参数为接收目标空间地址,第二个参数接收是源空间地址,返回参数是目标地址,size_t是无符号整数类型,num是追加字符的数目

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{char arr1[40] = "hello ";char arr2[13] = "shuxiansheng";strncat(arr1, arr2, 3);printf("%s",arr1);
}

在这里插入图片描述
strncat可以追加自己

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{char arr1[40] = "hello ";char arr2[13] = "shuxiansheng";strncat(arr1, arr1, 5);printf("%s",arr1);
}

在这里插入图片描述

4.strncmp

功能:可以比较指定个数的字符串比较
声明:int strncmp ( const char * str1, const char * str2, size_t num );
头文件:string.h
参数:第一个参数接收第一个字符串地址,第二个参数接收第二个字符串地址,第三个参数为比较字符的个数,比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{char arr1[6] = "hello";char arr2[] = "helld";int ret=strncmp(arr1, arr2, 4);printf("%d", ret);
}

在这里插入图片描述
比较前四个字符,由于前四个字符相同,返回0,比较五个字符,o的ascll码值大于d的ascll码值返回1;

5.strstr

功能:查找子串
声明: char * strstr ( char * str1, const char * str2 );
头文件string.h
参数:第一个参数接收被查找的字符串的首地址,第二个参数疑似子串的字符串的首地址
如果是子串的话,返回字符串中子串的首地址,不是子串的话返回空指针

int main()
{char arr1[] = "abcdefg";char arr2[] = "fg";char *p=strstr(arr1,arr2);//保存返回子串的首地址if (p){printf("是子串:%s", p);}else{printf("不是子串");}}

在这里插入图片描述
在这里插入图片描述

6.strtok

功能:分隔子串
声明:char * strtok ( char * str, const char * sep );
头文件:string.h
参数:第一个参数接收被分解字符串的地址,第二个参数中接收的是字符串中分隔符的地址,返回被分隔子串的首地址

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] = "hello@qq.com";char arr2[] = "@.";strtok(arr1, arr2);printf("%s", arr1);
}

在这里插入图片描述
第一个参数指定一个字符串,它包含了0个或者多个由arr2字符串中一个或者多个分隔符分割的标记。
strtok函数找到arr1中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。
strtok函数的第一个参数不为 NULL ,函数将找到arr1中第一个标记,strtok函数将保存它在字符串中的位置(strtok函数在内部维护了一个静态变量保存这个位置)。
strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
如果字符串中不存在更多的标记,则返回 NULL 指针

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] = "hello@qq.com";char arr2[] = "@.";printf("%s\n", strtok(arr1, arr2));printf("%s\n", strtok(NULL, arr2));printf("%s\n", strtok(NULL, arr2));}

在这里插入图片描述
**修改:**我们可以将字符串arr1传给strtok函数,第一个@分隔符。strtok函数返回字符串中第一个遇到分隔符之前的字符串首地址,”hello’',然后在循环中继续调用strtok函数,第一个参数传NULL,strtok自己维护的静态变量,记住上次分隔的地方,不用在传arr1.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] = "hello@qq.com";char arr2[] = "@.";char* p =NULL;for (p = strtok(arr1, arr2); p != NULL; p = strtok(NULL, arr2)){printf("%s\n",p);}}

在这里插入图片描述

7.strerror

功能:可以返回指向错误信息字符串地址
声明:char *strerror( int errnum );
头文件:string.h errno.h
参数:errnum是错误码,就像404页面,每个错误码对应着错误信息,返回值是指向错误信息字符串地址

int main()
{printf("%s\n", strerror(0));printf("%s\n", strerror(1));printf("%s\n", strerror(2));printf("%s\n", strerror(3));}

在这里插入图片描述
当我们向内存申请空间时,我们会使用malloc函数,如果申请的内存太大,是否会报错呢??它会将错误码放在整型全局变量errno中,使用errno时引用头文件errno.h

`#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{int *p=malloc(4000000000);//malloc申请内存失败会返回空地址if (p == NULL){printf("%s\n", strerror(errno));}}`

在这里插入图片描述
注意:遇到多个错误时,errno会不断赋新的错误码

8.strcat的模拟实现

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* mystrcat(char* p, char* q)
{assert(p && q);char* k = &p;//随着p++,会丢失目标字符串首地址先保存while (*p){p++;}//将p指针移动到目标字符串'\0'位置while ((*p++=*q++))//将*q的值先给*p,然后两个q++;p++;赋值后的ascll值不为0,继续循环,当*q=='\0',赋值后ascll码值为'\0',退出循环{}return k;//返回目标字符串首地址
}
int main()
{char arr1[20] = "abcde";char arr2[5] = "qqq";mystrcat(arr1, arr2);printf("%s", arr1);}

在这里插入图片描述

9.strstr的模拟实现

char* mystrstr(char* str1, char* str2)
{char* s1 = str1;//两个遍历指针分别指向两个字符串的首地址char* s2 = str2;char* cur = s1;//两个字符串开始匹配的指针while (*cur)//每循环一次,就是重新匹配的过程{s1 = cur;//s1移动到下一个开始匹配的位置s2 = str2;//子串要从头开始匹配while (*s1&&*s2&&(*s1 == *s2))//匹配的循环{s1++;s2++;}//不匹配退出循环if (*s2 == '\0')//当匹配循环完,s2的指针指向子串的末尾'\0';{return cur;//保存的是匹配成功时,字符串中匹配到的第一个字符首地址}cur++;                       //此时cur指向的位置不能作为开始匹配的位置,cur++;开始新一轮的匹配}return NULL;//当cur遍历完字符串,则说明没有该子串
}
int main()
{char arr1[] = "abcdecdfg";char arr2[] = "cdf";char *p=mystrstr(arr1,arr2);//如果找到子串返回字符串中和子串匹配的首字符首地址不为空if (p){printf("是子串");}else{printf("不是子串");}}

在这里插入图片描述
在这里插入图片描述

总结

今天的内容就分享到这里了!!!
还有未讲到的内存操作函数放在后续讲,如果你觉得这篇文章对你有帮助的话,可以给小樊点赞,哪里有问题的话还请大佬们指教,谢谢大家!!

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

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

相关文章

随机密码生成器(Python)

随机密码生成器 想要生成一个随机密码&#xff0c;需要考虑下面两点&#xff1a; 1.字符集合 2.密码的位数 下面代码中引用了string模块和random模块&#xff0c;string.printable是string中的可打印字符&#xff0c;用strip函数首尾去掉空格&#xff1b;random模块用来取字符&…

C# wpf 实现桌面放大镜

文章目录 前言一、如何实现&#xff1f;1、制作无边框窗口2、Viewbox放大3、截屏显示&#xff08;1&#xff09;、截屏&#xff08;2&#xff09;、转BitmapSource&#xff08;3&#xff09;、显示 4、定时截屏 二、完整代码三、效果预览总结 前言 做桌面截屏功能时需要放大镜…

品牌策划经理工作内容|工作职责|品牌策划经理做什么?

一位美国作家曾说过“品牌是一系列期望、记忆、故事和关系&#xff0c;他们共同构成了消费者最终原则一个产品或者服务的原因。” 所以&#xff0c;品牌经理这个岗位主要是创造感知价值主张&#xff0c;激发消费者购买这个品牌后带来的感知价值&#xff0c;这种回报的本质相对…

C语言实现三子棋游戏(详解)

目录 引言&#xff1a; 1.游戏规则&#xff1a; 2.实现步骤&#xff1a; 2.1实现菜单&#xff1a; 2.2创建棋盘并初始化&#xff1a; 2.3绘制棋盘&#xff1a; 2.4玩家落子&#xff1a; 2.5电脑落子&#xff1a; 2.6判断胜负&#xff1a; 3.源码&#xff1a; 结语&…

论文阅读 (100):Simple Black-box Adversarial Attacks (2019ICML)

文章目录 1 概述1.1 要点1.2 代码1.3 引用 2 背景2.1 目标与非目标攻击2.2 最小化损失2.3 白盒威胁模型2.4 黑盒威胁模型 3 简单黑盒攻击3.1 算法3.2 Cartesian基3.3 离散余弦基3.4 一般基3.5 学习率 ϵ \epsilon ϵ3.6 预算 1 概述 1.1 要点 题目&#xff1a;简单黑盒对抗攻…

力扣刷题-移除指定值的链表元素

力扣203移除元素 题目来源&#xff1a; 力扣203 题目描述&#xff1a; 非常简单的一道题&#xff0c;主要强调两点 链表删除要记录删除位置的前驱节点 头节点没有前驱 因此直接headhead.next为了保持与后两种一致&#xff0c;加上虚拟节点&#xff0c;下一节点指向头节点 /***…

【Linux-Day10-信号量,共享内存,消息队列】

信号量 信号量描述 信号量是一个特殊的变量&#xff0c;一般取正数值。它的值代表允许访问的资源数目&#xff0c;获取资源 时&#xff0c;需要对信号量的值进行原子减一&#xff0c;该操作被称为 P 操作。 当信号量值为 0 时&#xff0c;代表没有资源可用&#xff0c;P 操作…

企业架构LNMP学习笔记27

Keepalived的配置补充&#xff1a; 脑裂&#xff08;裂脑&#xff09;&#xff1a;vip出现在了多台机器上。网络不通畅&#xff0c;禁用了数据包&#xff0c;主备服务器没法通讯&#xff0c;造成备服务器认为主服务器不可用&#xff0c;绑定VIP&#xff0c;主服务器VIP不会释放…

【设计模式】三、概述分类+单例模式

文章目录 概述设计模式类型 单例模式饿汉式&#xff08;静态常量&#xff09;饿汉式&#xff08;静态代码块&#xff09;懒汉式(线程不安全)懒汉式(线程安全&#xff0c;同步方法)懒汉式(线程安全&#xff0c;同步代码块)双重检查静态内部类枚举单例模式在 JDK 应用的源码分析 …

[N0wayback 2023春节红包题] happyGame python反编译

这个反编译的比较深 一&#xff0c;从附件的图标看是python打包的exe文件&#xff0c;先用pyinstxtractor.py 解包 生成的文件在main.exe_extracted目录下&#xff0c;在这里边找到main 二&#xff0c;把main改名为pyc然后加上头 这个头从包里找一个带头的pyc文件&#xff…

做题(1)

1.fileinclude 打开 发现提示flag在flag.php里边 查看页面源代码 $lan $_COOKIE[language]; 这句话是关键 变量lan是用cookie传参的 include("english.php"); 这句话表明了文件包含 include函数用php伪协议 filer绕过 include($lan.".php"); 这句话…

深入实现 MyBatis 底层机制的任务阶段4 - 开发 Mapper 接口和 Mapper.xml

&#x1f600;前言 在我们的自定义 MyBatis 底层机制实现过程中&#xff0c;我们已经深入研究了多个任务阶段&#xff0c;包括配置文件的读取、数据库连接的建立、执行器的编写&#xff0c;以及 SqlSession 的封装。每个任务阶段都为我们揭示了 MyBatis 内部工作原理的一部分&a…

【算法基础】时间复杂度和空间复杂度

目录 1 算法的评价 2 算法复杂度 2.1 时间复杂度&#xff08;Time Complexity&#xff09; 2.1.1 如何计算时间复杂度&#xff1a; 2.1.2 常见的时间复杂度类别与示例 2.2 空间复杂度 2.2.1 如何计算空间复杂度 2.2.2 常见的空间复杂度与示例 3 时间复杂度和空间复杂度…

Linux——环境变量

✅<1>主页&#xff1a;&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;Linux——环境变量 ☂️<3>开发环境&#xff1a;Centos7 &#x1f4ac;<4>前言&#xff1a;环境变量(environment variables)一般是指在操作系统中用来指定操作…

linux下检测CPU性能的mpstat命令安装与用法

1、安装命令 $ sudo apt-get install sysstat sysstat安装包还包括了检测设备其它状态的命令&#xff0c;查看命令如下&#xff1a; 2、检测CPU命令语法 $ mpstat --h //查看mpstat的语法 Usage: mpstat [ options ] [ <interval> [ <count> ] ] Options are: …

期货基础知识

一、期货是什么&#xff1f;  期货是与现货相对应&#xff0c;并由现货衍生而来。期货通常指期货合约&#xff0c;期货与现货完全不同&#xff0c;现货是实实在在可以交易的货&#xff08;商品&#xff09;&#xff0c;期货主要不是货&#xff0c;而是以某种大众产品如棉花、大…

UG\NX二次开发 获取曲面上指定点位置的uv参数 UF_MODL_ask_face_parm

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 简介: UG\NX二次开发 获取曲面上指定点位置的uv参数 UF_MODL_ask_face_parm。 效果: 代码: #include "me.hpp"//parm[2] static void AskFaceUVP…

【插件分享】免费获取ArcGIS国土插件,可一键加载最新亚米级卫星图源

免费获取ArcGIS国土插件&#xff0c;可一键加载最新亚米级卫星图源 国土工具 实用功能国土工具持续更新插件项目实操01 项目占地分析02 shp转txt土地报备坐标03 txt转shp04 在线加载0.5米遥感影像、电子地图服务05 实用工具 如何获取国土工具免费授权第1步第2步第3步 插件下载&…

vscode开发油猴插件环境配置指南

文章目录 一、环境配置1.1油猴插件开始编写代码1.2油猴插件配置1.2.1浏览器插件权限1.2.2插件自身权限 2. 油猴脚本API学习2.1 头文件2.2 油猴API 一、环境配置 1.1油猴插件开始编写代码 在vscode 中写入如下代码‘ // UserScript // name cds_test // namespace …

Java基于SpringBoot+Vue的 4S店车辆管理系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈3 功能总览4 系统设计4.1 系统设计主要功能4.2 数据库设计4.2.1 数据库设计规范4.2…