十一.字符串函数与内存函数

news2025/1/17 1:03:02

目录

一.求字符串长度

二.长度不受限制的字符串函数

1.strcpy函数

2.strcat函数

3.strcmp函数

三.长度受限制的字符串函数

1.strncpy函数

2.strncat函数

3.strncmp函数

四.字符串查找

1.strstr函数

2.strtok函数

3.strerror函数

五.字符操作

1.字符分类

2.字符转换

六.字符操作函数

1.memcpy函数

2.memmove函数

3.memcmp函数

4.memset函数


一.求字符串长度

strlen函数

头文件:string.h

size_t strlen(const char* str)   //求字符串长度

注:

  • 字符串以 ‘\0’ 作为结束标志,strlen 返回的是在字符串中 ‘\0’ 前面出现的字符个数
  • 参数指向的字符串必须以  ‘\0’  结束 
  • 函数的返回值为 size_t ,无符号(unsigned)

用法演示:

#include <stdio.h>
#include <string.h>
 
int main()
{
    int len = strlen("abcdef");
    printf("%d\n", len);
 
    return 0;
}

 运行结果:6

二.长度不受限制的字符串函数

1.strcpy函数

头文件:string.h

char *strcpy(char *dest, const char *src);  //字符串拷贝
//dest为目标空间,src为要拷贝的源字符串 

 注:

  • 字符串拷贝,将含有 ‘\0’ 的字符串复制到另一个地址空间,返回值的类型为 char*
  • 源字符串 src 必须以 ‘\0’ 结束
  • 会将源字符串 src 中的 ‘\0’ 一同拷贝到目标空间 dest
  • 目标空间必须足够大,以确保能够存放源字符串 dest (下面讲 strncmp 的时候演示)
  • 目标空间必须可变,即目标空间 dest 不可以被 const 声明

用法演示:

#include <stdio.h>
#include <string.h>
 
int main()
{
    char arr1[] = "abcdefghi";
    char arr2[] = "123";
    printf("拷贝前:%s\n", arr1);
 
    strcpy(arr1, arr2);  //字符串拷贝(目标空间,源字符串)
 
    printf("拷贝后:%s\n", arr1);
 
    return 0;
}

 运行结果:abcdefghi      123

2.strcat函数

头文件:string.h

char *strcat(char *dest, const char *src)  //字符串拼接
//dest为目标字符串,src为要拼接的源字符串

注:

  • src 所指向的字符串复制到 dest 所指向的字符串后面(删除 *dest 原来末尾的 ‘\0’
  • 源字符串 src 必须以 ‘\0’ 结束
  • 会将源字符串 src 中的 ‘\0’ 一同拷贝到目标空间 dest ,并删除 *dest 原来末尾的 ‘\0’
  • 目标空间必须足够大,以确保能够存放源字符串 dest
  • 目标空间必须可变,即目标空间 dest 不可以被 const 声明

 用法演示:

#include <stdio.h>
#include <string.h>
 
int main()
{
    char arr1[30] = "hello";
    char arr2[] = "world";
    
    strcat(arr1, arr2);
    printf("%s\n", arr1);
 
    return 0;
}

运行结果:helloworld 

3.strcmp函数

头文件:string.h

int strcmp(const char *str1, const char *str2) //比较字符串的大小

用于比较两个字符串并根据比较结果返回整数, 两个字符串自左向右逐个字符相比,按照 ASCII值 大小相比较,从第一对字符开始比,如果相等则比下一对,直到出现不同的字符或遇 ‘\0’ 才停止。对比规则如下: 

第一个字符串>第二个字符串  返回正数
第一个字符串=第二个字符串  返回0
第一个字符串<第二个字符串  返回负数

 用法演示:

#include <stdio.h>
#include <string.h>
 
int main()
{   
    char *p1 = "abcdef";
    char *p2 = "aqwer";
    int ret = strcmp(p1, p2); // p1和p2比

    printf("%d\n", ret);
 
    return 0;
}

运行结果:-1(负数)

三.长度受限制的字符串函数

1.strncpy函数

头文件:string.h

char *strncpy(char *dest, const char *src, size_t count)  //指定长度的字符串拷贝

注:

  • 从源字符串中拷贝 n 个字符到目标空间
  • 如果源字符串的长度小于 n,则拷贝完源字符串之后,在目标的后面追加 '\0',填充至 n 个
  • destsrc 不应该重叠(重叠时可以用更安全的 memmove 替代)
  • 目标空间必须足够大,以确保能够存放源字符串 dest
  • 目标空间必须可变,即目标空间 dest 不可以被 const 声明

用法演示:

#include <stdio.h>
#include <string.h>
 
int main()
{
    char arr1[5] = "abc";
    char arr2[] = "hello world";
    strncpy(arr1, arr2, 4);  //从arr2中拷贝4个到arr1
    printf("%s\n", arr1);
 
    return 0;
}

 运行结果:hell

2.strncat函数

头文件: string.h

char *strncat(char *dest, const char *src, size_t count) //指定长度的字符串追加

注:

  • 追加 n 个字符到目标空间
  • 如果源字符串的长度小于 n,则只复制 ‘\0’ 之前的内容。

用法演示:

#include <stdio.h>
#include <string.h>
 
int main()
{
    char arr1[30] = "hello";
    char arr2[] = "world";
    strncat(arr1, arr2, 3);  //从arr2中取3个追加到arr1中
    printf("%s\n", arr1);
 
    return 0;
}

 运行结果:hellowor

3.strncmp函数

头文件: string.h

int strncpy(const char *str1, const char *str2, size_t count) //指定长度的字符串比较

比较到出现另个字符不一样或者一个字符串结束或者 n 个字符全部比较完。

( 除了指定长度n,比较方式和 strcmp 一样 )

 用法演示:

#include <stdio.h>
#include <string.h>
 
int main()
{
    const char* p1 = "abczdef";
    const char* p2 = "abcqwer";
   
    int ret = strncmp(p1, p2, 1);   //int ret = strcmp(p1, p2);
    int ret1 = strncmp(p1, p2, 4);
    printf("%d %d\n", ret, ret1);
 
    return 0;
}

 运行结果:0 1

四.字符串查找

1.strstr函数

头文件: string.h

char *strstr(const char str2,const char *str1)  //查找子串

返回字符串中首次出现子串的地址。若 str2 str1 的子串,则返回 str2 str1 中首次出现的地址。如果 str2 不是 str1 的子串,则返回 NULL 。 

用法演示:

#include <stdio.h>
#include <string.h>
 
int main()
{
    char* p1 = "abcdef";
    char* p2 = "def";
    char* p3 = "deg";
    char* ret1 = strstr(p1, p2); // 判断p2是否是p1的子串
    char* res2 = strstr(p1, p3);
    printf("%s\n", ret1);
    printf("%s\n", ret2);
 
    return 0;
}

 运行结果:def  null

2.strtok函数

头文件: string.h

char *strtok(char *str, const char *sep)  //切分字符串
  • sep参数是个字符串,定义了用作分隔符的字符集合
  • 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记
  • strtok函数找到str中的下一个标记,并将其用 ‘\0’ 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
  • strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
  • strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
  • 如果字符串中不存在更多的标记,则返回 NULL 指针。

用法演示:切分ip地址

//切分ip地址

#include <stdio.h>
#include <string.h>
 
int main()
{
    char ip[] = "192.168.0.1";
   
    char* ret = strtok(ip, ".");
    printf("%s\n", ret);
 
    ret = strtok(NULL, ".");
    printf("%s\n", ret);
 
    ret = strtok(NULL, ".");
    printf("%s\n", ret);
 
    ret = strtok(NULL, ".");
    printf("%s\n", ret);
 
    return 0;
}

 运行结果:

 用法演示:切分邮箱地址

//切分邮箱地址

#include <stdio.h>
#include <string.h>
 
int main()
{
    char arr[] = "1300300100@qq.com";
    printf("原字符串: %s\n", arr);
    
    const char* sep = "@."; // 创建sep
    char arr1[30];
    char* ret = NULL;
    strcpy(arr1, arr); // 将数据拷贝一份,保留arr数组的内容
 
    // 分行打印切割内容
    for (ret = strtok(arr, sep); ret != NULL; ret = strtok(NULL, sep)) {
        printf("%s\n", ret);
    }
 
    printf("保留的原内容:%s\n", arr1); // 保存的arr数组的内容
    printf("分割后原字符串被破坏: %s\n", arr); // 分割后原字符串保留第一个分割符前的字符
 
    return 0;
}

运行结果:

3.strerror函数

头文件: string.h

char * strerror ( int errnum )

 返回错误码,返回错误码所对应的错误信息

  • 错误码       错误信息
    0 -          No error
    1 -          Operation not permitted
    2 -          No such file or directory
    ...

用法演示:

#include <string.h>
#include <stdio.h>
#include <errno.h>
 
int main()
{
    //errno 是一个全局的错误码变量
    //当c语言的库函数在执行过程中,发生了错误,
    //就会把对应的错误码赋值到errno中
    char* str = strerror(errno);
    printf("%s\n", str);
 
    return 0;
}

运行结果:No error

关于errno:头文件:errno.h 

errno 是记录系统的最后一次错误代码,返回一个int 型的值,对应strerror的错误码

五.字符操作

1.字符分类

头文件: ctype.h

函数如果他的参数符合下列条件就返回真
iscntrl任何控制字符
isspace空白字符:空格‘ ’,换页‘\f’,换行'\n',回车‘\r’,制表符'\t'或者垂直制表符'\v'
isdigit十进制数字 0~9
isxdigit十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A~F
islower小写字母a~z
isupper大写字母A~Z
isalpha字母a~z或A~Z
isalnum字母或者数字,a~z,A~Z,0~9
ispunct标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraph任何图形字符
isprint任何可打印字符,包括图形字符和空白字符

用法演示:islower

#include <stdio.h>
#include <ctype.h>
 
int main()
{
    char ch1 = 'a';
    int ret = islower(ch1); // 判断ch1是否为小写
    printf("%d\n", ret);
 
    char ch2 = 'B';
    int res = islower(ch2); // 判断ch2是否为小写
    printf("%d\n", res);
 
    return 0;
}

运行结果:2(非0为真,表示小写)  0(假,表示大写) 

2.字符转换

头文件:ctype.h

int tolower ( int c );
int toupper ( int c );

用法演示:tolower(大写转为小写)

int main()
{
    char ch = tolower('Q'); // 大写转小写
    putchar(ch);
 
    return 0;
}

运行结果:q

用法演示:toupper(小写转为大写)

int main()
{
    char ch = toupper('q'); // 小写转大写
    putchar(ch);
    
    return 0;
}

运行结果:Q

六.字符操作函数

1.memcpy函数

头文件: string.h

void *memcpy(void *dest, const void *src, size_t count)
//src源内存地址,dest目标内存地址,count字节数
  • 从源内存地址 src 的起始位置开始拷贝 n 个字节到目标内存地址 dest
  • memcpy 没有刹车,这个函数遇到 ‘\0’ 并不会停下来
  • 如果 srcdest 有任何的重叠,复制的结果都是未定义的

用法演示:

#include <stdio.h>
#include <string.h>
 
int main()
{
    int arr1[] = {1, 2, 3, 4, 5};
    int arr2[5] = {0};
    memcpy(arr2, arr1, sizeof(arr1));
 
    // 打印 arr2 的内容
    int i = 0;
    for(i=0; i<5; i++) {
        printf("%d ", arr2[i]);
    }
 
    return 0;
}

 运行结果:1 2 3 4 5

2.memmove函数

头文件: string.h

void *memmove(void *dest, const void *src, size_t count)
  • 用于拷贝字节,如果目标区域和源区域有重叠时,memmove 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,但复制后源内容会被更改。
  • memcpy 的差别就是 memmove 函数处理的源内存块和目标内存块时可以重叠的
  • 如果原空间和目标空间出现重叠,应使用 memmove 函数处理 

用法演示:

#include <stdio.h>
#include <string.h>
 
int main()
{
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    int i = 0;
 
    memmove(arr+2, arr, 20);
 
    for(i=0; i<10; i++) {
        printf("%d ", arr[i]);
    }
 
    return 0;
}

 运行结果:1 2 1 2 3 4 5 8 9 10

3.memcmp函数

头文件: string.h

int memcmp(const void *ptr1, const void *ptr2, size_t num)

比较 ptr1 ptr2 指针开始的 n 个字节,按字节比较 

  • ptr1>ptr2  返回正数
  • ptr1=ptr2  返回 0
  • ptr1<ptr2  返回负数

memcmp 不同于 strcmpmemcmp 遇到 ‘\0’ 不会停止比较

用法演示:

#include <stdio.h>
#include <string.h>
 
int main()
{
    float arr1[] = {1.0, 2.0, 3.0, 4.0};
    float arr2[] = {1.0, 3.0};
    int ret = memcmp(arr1, arr2, 8); // arr1是否比arr2大,比较8个字节
    printf("%d\n", ret);
    
    return 0;
}

 运行结果:-1(说明arr1的前八字节小于arr2的前八字节)

4.memset函数

头文件: string.h

void *memset(void *ptr, int value, size_t num)
  • 将某一块内存中的内容全部设置为指定的值,通常为新申请内存做初始化工作。
  • memset 是以字节为单位设置内存的

用法演示:把整型数组前20个字节设置为1

#include <stdio.h>
#include <string.h>
 
int main()
{
    // 40
    int arr[10] = {0};
    memset(arr, 1, 20); // 将前20个字节全部设置为1
 
    return 0;
}

 运行结果:


本文到此结束,码文不易,还请多多支持哦! 

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

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

相关文章

【SpringCloud04】订单-支付微服务模块(消费者订单模块)

1.建cloud-consumer-order80 2.改pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://…

黑客在 GitHub 上的劫持活动中使用验证码绕过策略

作为名为 PURPLEURCHIN 的免费劫持活动的一部分&#xff0c;已观察到一个名为 Automated Libra 的南非威胁行为者使用验证码旁路技术以编程方式创建 GitHub 帐户。 Palo Alto Networks Unit 42 研究人员 William Gamazo 和 Nathaniel Quist 表示&#xff0c;该组织“主要针对提…

【UE4 第一人称射击游戏】36-切换武器时改变UI

上一篇&#xff1a;UE4 第一人称射击游戏】35-击中目标时添加准心提示本篇效果&#xff1a;步骤&#xff1a;打开项目设置&#xff0c;添加两个操作映射两个操作映射分别命名为“SelectPrimary”和“SelectSecondary”&#xff0c;通过键盘1和2控制&#xff0c;分别表示玩家当前…

【MySQL】-【索引的创建与设计原则】

目录索引的声明与使用索引的分类创建索引创建表的时候创建索引在已经存在的表上创建索引索引的声明与使用 索引的分类 MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。&#xff08;没有空间索引是因为有的存储引擎不支持空间索引&#xff…

波士顿房价预测——机器学习入门级案例

一、数据处理 1.1 数据集介绍 本实验使用波士顿房价预测数据集&#xff0c;共506条样本数据&#xff0c;每条样本包含了12种可能影响房价的因素和该类房屋价格的中位数&#xff0c;各字段含义如下表所示&#xff1a; 字段名类型含义CRIMfloat该镇的人均犯罪率ZNfloat占地面积…

springboot中迁移接口报404错误找不到 main方法java.lang.UnsupportedClassVersionError的经历

一、出现问题公司有接口要迁移到新服务中&#xff0c;服务不能启动错误大概如下&#xff1a;错误: 在类 ### 中找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args) 否则 JavaFX 应用程序类必须扩展javafx.application.Application问题1解决后&am…

字符串函数和内存函数

在c语言中&#xff0c;有非常多的库函数&#xff0c;比如我们经常使用的scanf和printf&#xff0c;除此之外&#xff0c;还有一些非常实用的函数&#xff0c;比如我们之前使用的qsort排序函数&#xff0c;可以对任意数据类型进行排序&#xff0c;strlen函数&#xff0c;可以计算…

1.5万字总结 Redis 常见面试题知识点

以下内容来源于于我开源的 JavaGuide (Java学习&&面试指南,Github 130k star,370人共同参与爱完善), 万字总结,质量有保障! Redis 基础 什么是 Redis? Redis 是一个基于 C 语言开发的开源数据库(BSD 许可),与传统数据库不同的是 Redis 的数据是存在内存中的…

磨金石教育插画技能干货分享|学习插画可以从事什么工作?

近几年插画师这个行业越来越热&#xff0c;许多有一定绘画基础的朋友&#xff0c;都在跃跃欲试&#xff0c;想要走进插画这个行业。但不少人都有一种担忧&#xff0c;就是插画师这个职位平时听的很少&#xff0c;认为这是个冷门行业&#xff0c;是不是难以就业&#xff0c;风险…

边双连通分量

如果还未学习强连通分量&#xff0c;建议先学习强连通分量的tarjan算法强连通分量&#xff08;tarjan算法&#xff09; 1&#xff0c;定义 相对于在单向图的强连通分量&#xff0c;双连通分量是在无向图中&#xff0c;无向图有一个特点&#xff0c;可以以任何一个点为根节点建…

Java开发常见漏洞及解决方案

文章目录1.健康监控Actuator暴露端口2.SSRF漏洞攻击3.富文本XSS攻击4.暴力破解短信验证码登录5.恶意短信轰炸骚扰用户6.低版本Fastjson导致RCE漏洞7.SQL注入漏洞8.水平越权信息泄露9.权限绕过漏洞1.健康监控Actuator暴露端口 ​ Actuator是Springboot提供的用来对应用系统进行…

html 判断视频是否播放

html 判断视频是否播放 html <video id"video" loop preload"auto" autoplay><source src"1.mp4" type"video/mp4">您的浏览器不支持Video标签。 </video> js代码 var videodocument.querySelector("#vide…

phpstudy如何安装PHP扩展sg11

1、下载sg11扩展文件压缩包&#xff0c;下载地址&#xff1a;PHP扩展sg11.zip - 蓝奏云 2、解压下载好的sg11压缩包&#xff0c;选择对应你自己的服务器系统文件夹&#xff0c;我的是Windows 64-bit 3、打开Windows 64-bit&#xff0c;复制对应PHP版本的.win文件&#xff0c;…

电脑一键重装系统win11步骤教程

win11系统是微软目前最新的操作系统&#xff0c;很多人都想给电脑重装系统win11体验。那么具体要怎么重装系统win11呢?我们可借助一键装机工具实现&#xff0c;下面就演示下简单的一键重装系统win11步骤教程 工具/原料&#xff1a; 系统版本&#xff1a;Windows 11 品牌型号…

基于轻量级ShuffleNetv2+YOLOv5的DIC-C2DH-HeLa细胞检测识别分析系统

ShuffleNetv2可以说是目前轻量级网络模型中的翘楚&#xff0c;将ShuffleNetv2于yolov5整合开发可以使得模型更加轻量化&#xff0c;在提升模型速度的同时保证有效的精度。本文的主要工作就是将ShuffleNetv2整合进yolov5中来开发构建细胞检测模型&#xff0c;首先看下效果图&…

4-3文件管理-磁盘组织与管理

文章目录一.磁盘的结构二.磁盘调度算法&#xff08;一&#xff09;一次读/写磁盘需要的时间&#xff08;二&#xff09;磁盘调度算法1.先来先服务FCFS2.最短寻找时间优先SSTF3.扫描算法/电梯调度算法SCAN4.循环扫描算法C-SCAN&#xff08;三&#xff09;减少磁盘延迟时间的方法…

再谈模板(19)

目录 1、非类型模板参数 2、模板的特化 1、定义 2、函数模板特化 3、类模板特化 1、全特化 2、偏特化 3、分离编译 1、什么是分离编译 2、模板不支持分离编译 4、模板总结 1、非类型模板参数 模板参数&#xff1a;类型形参与非类型形参。 类型形参&#xff1a;出现…

Leetcode - 24 - 两两交换链表中的节点

24. 两两交换链表中的节点 题目描述 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;h…

重写部分调试体系的DebugPort隐藏

背景逛世界上最大的交友网站的时候发现了一个开源的vt调试器&#xff0c;抱着学习的心态&#xff0c;下载下来学习学习。但是呢&#xff0c;实际编译出来的程序和release发布的有很大的区别&#xff0c;而且源码很乱&#xff0c;release版本的驱动至少能调试程序&#xff0c;但…

文件IO操作

日升时奋斗&#xff0c;日落时自省 目录 1、文件基本认知 1.1、文件路径 1.2、相对路径 1.3、文件类型 2、Java的文件操作 2.1、文件操作类File 3、数据流读写 3.1字节流读文件 3.2、字节流写文件 3.3、字符流读操作 3.4、字符流写操作 4、文件操作案例 4.1、删除…