【C语言】字符函数与字符串函数以及内存函数 { 超详细攻略,一篇学会 }

在这里插入图片描述
今日分享:字符、字符串函数和内存函数
内存函数就是对内存进行操作的函数
字符串函数就是对字符串进行操作的函数
字符函数就是对字符进行操作的函数
str前缀的函数是字符串函数,头文件string.h
mem前缀的函数是内存函数,头文件stdlib.h


字符函数与字符串函数以及内存函数

  • 一、字符分类函数
  • 二、字符转换函数
  • 三、strlen函数
  • 四、strcpy、strncpy、memcpy函数
    • 1、strcpy
    • 2、strncpy
    • 3、memcpy
  • 五、strcat、strncat函数
    • 1、strcat
    • 2、strncat
  • 六、strcmp、strncmp、memcmp函数
    • 1、strcmp
    • 2、strncmp
    • 3、memcmp
  • 七、strstr、strtok、strerror函数
    • 1、strstr
    • 2、strtok
    • 3、strerror
      • perror
  • 八、memmove、memset函数
    • memmove
    • memset

一、字符分类函数

字符分类函数包含在 <ctype.h> 头文件下,专门用来分类字符,如果是则返回非0数字,如果不是返回0
1、iscntrl(int c): 检查是否为控制字符(非打印字符,ASCII码在0x00至0x1F之间,以及0x7F(DEL))
2、isspace(int c): 检查是否为空白字符(空格、制表符、换行符、垂直制表符、换页符和回车符)
3、isdigit(int c): 检查是否为数字(0至9)
4、isxdigit(int c): 检查是否为十六进制数字(0至9,a至f,A至F)
5、islower(int c): 检查是否为小写字母(a至z)
6、isupper(int c): 检查是否为大写字母(A至Z)
7、isalpha(int c): 检查是否为字母(大写或小写)
8、isalnum(int c): 检查是否为字母或数字
9、ispunct(int c): 检查是否为标点符号(除空格和字母数字字符外的可打印字符)
10、isgraph(int c): 检查是否为除空格外的可打印字符
11、isprint(int c): 检查是否为可打印字符(包括空格)

二、字符转换函数

C语言有两个字符转换函数,分别是大写转小写tolower,小写转大写toupper

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

简单记忆 :
to(变)upper(大写)
to(变)lower(小写)

三、strlen函数

我们在之前的学习中肯定会接触并使用到strlen函数,它的作用是统计字符串中’ \0’ 之前的元素个数,返回值为size_t类型的无符号整型
这个我们就不做过多赘述了,使用方法应该已经深入人心了

四、strcpy、strncpy、memcpy函数

这三个函数都是copy家族的函数,我们放在一起讨论,但字符串函数和内存函数的操作对象不同,适用的范围不同
strcpy和strncpy的返回值都是一个字符指针,指向第一个字符。而memcpy的返回值是void*,因为它可以作用于任意类型的对象,而前面两个智能针对于字符,所以memcpy适用范围更加广泛

1、strcpy

char* strcpy(char * destination, const char * source );

strcpy返回值是char*,destination为被操作对象的指针,source为操作对象的指针,将source复制到destination中,destination字符串必须以’\0’结尾,并且足够大,source中的’\0’会被复制到第一个参数中,destination中的内容会被source完全覆盖

#include <stdio.h>
#include <string.h>
int main()
{char s1[256] = "ABCD";char s2[] = "GHAZF";strcpy(s1, s2);printf("%s", s1);return 0;
}

在这里插入图片描述

2、strncpy

在字符串标识str与复制cpy之间加了一个n,表示要复制过去的字符个数
不过它不会完全覆盖,而是将指定相对应的字符复制过去

char* strcpy(char * destination, const char * source, int n);
#include <stdio.h>
#include <string.h>
int main()
{char s1[256] = "ABCD";char s2[] = "GHA";strncpy(s1, s2, 2);printf("%s", s1);return 0;
}

在这里插入图片描述

3、memcpy

void * memcpy ( void * destination, const void * source, size_t num );

函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置,这里的destination可以传任意的地址,可以是数组,也可以是字符串,它都可以进行复制,但这个函数在遇到 ‘\0’ 的时候并不会停下来,所以如果source和destination有任何的重叠,复制的结果都是未定义的。这里我们的最优解就是使用我们后边会说的memmove函数

#include <stdlib.h>
int main()
{int arr1[] = { 1,2,3,4,5 };int arr2[] = { 6,7,8,9,10};memcpy(arr1, arr2, 2);int sz = sizeof(arr1) / sizeof(arr1[0]);for (int i = 0; i < sz; i++){printf("%d ", arr1[i]);}return 0;
}

在这里插入图片描述

五、strcat、strncat函数

1、strcat

源字符串必须以 ‘\0’ 结束,⽬标字符串中也得有 ‘\0’ ,追加从 ‘\0’ 开始。
⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
⽬标空间必须可修改

#include <stdio.h>
#include <string.h>
int main()
{char s1[256] = "ABCD";char s2[] = "GHA";strcat(s1, s2);printf("%s", s1);return 0;
}

在这里插入图片描述

最好不要自己追加自己
如:

#include <stdio.h>
#include <string.h>
int main()
{char s1[256] = "ABCD";strcat(s1, s1);printf("%s", s1);return 0;
}

在这里插入图片描述
虽然结果与我们预期相同,但我们不建议这样做,我们可以先定义一个中间变量先cpy再cat

2、strncat

char * strncat ( char * destination, const char * source, size_t num );

同strcpy与strncpy的关系:

#include <stdio.h>
#include <string.h>
int main()
{char s1[256] = "ABCD";char s2[] = "GHA";strncat(s1, s2, 2);printf("%s", s1);return 0;
}

在这里插入图片描述
当n值改为4时
在这里插入图片描述
大于source元素个数的话按照最大元素个数来连接

六、strcmp、strncmp、memcmp函数

1、strcmp

第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字
第⼀个字符串等于第⼆个字符串,则返回0
第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字

int strcmp ( char * destination, const char * source);
#include <stdio.h>
#include <string.h>
int main()
{char s1[] = "ABCD";char s2[] = "ABCD";printf("%d", strcmp(s1, s2));return 0;
}

在这里插入图片描述

2、strncmp

这里不做过多赘述,原理同上,都是有规律可循的

 int strncmp ( const char * str1, const char * str2, size_t num );
#include <stdio.h>
#include <string.h>
int main()
{char s1[] = "ABCD";char s2[] = "ABCE";printf("%d", strncmp(s1, s2, 3));return 0;
}

在这里插入图片描述

3、memcmp

int memcmp ( const void * p1, const void * p2, size_t n );

⽐较从p1和p2指针指向的位置开始,向后的n个字节(任意数据类型)

#include <stdio.h>
#include <string.h>
int main()
{int str1[] = { 1,2,3,4,5 };int str2[] = { 1,2,5,2,1 };printf("%d", memcmp(str1, str2, 4*4));return 0;
}

在这里插入图片描述

七、strstr、strtok、strerror函数

1、strstr

函数返回字符串str2在字符串str1中第⼀次出现的位置,字符串的⽐较以 \0 作为结束标志

char * strstr ( const char * str1, const char * str2);
#include <stdio.h>
#include <string.h>
int main()
{char s1[] = "ABCD";char s2[] = "BC";printf("%p", strstr(s1, s2));return 0;
}

通过调试我们发现,下图图一的地址是s1,也就是首字符’A’的位置,因为是char类型,'B’的位置在’A’的后一位,打印出来的地址就是a+1
图一

图二

2、strtok

sep参数指向⼀个字符串,定义了⽤作分隔符的字符集合。第⼀个参数指定⼀个字符串,它作为你想要用某一符号分隔的标记,符号之间用逗号隔开,它每次找到下一个标记就在这个标记前放一个’\0’然后在这个’\0’后边的第一个元素放一个指针。strtok函数的第⼀个参数若不为 NULL ,函数将找到str中第⼀个标记,strtok函数将保存它在字符串中的位置,若第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标记。如果字符串中不存在更多的标记,则返回 NULL 指针。

char * strtok ( char * str, const char * sep);
#include <stdio.h>
#include <string.h>
int main()
{char arr[] = "https://blog.csdn.net/s_little_monster?spm=1000.2115.3001.5343";char* sep = ": , / , . , = , ?";char* str = NULL;for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep)){printf("%s\n", str);}return 0;
}

在这里插入图片描述

3、strerror

 char * strerror ( int errnum );

在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码放在 errno.h 这个头⽂件中说明,C语⾔程序启动的时候就会使⽤⼀个全局的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会将对应的错误码存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。

将这些信息打印:

#include <stdio.h>
#include <string.h>
#include <errno.h>int main()
{int i = 0;for (i = 0; i <= 10; i++) {printf("%s\n", strerror(i));}return 0;
}

在这里插入图片描述

perror

这个函数可以直接打印错误信息,使用方法与strerror相似

(这两个函数作为补充,因为我也不太清楚它们的工作方法)

八、memmove、memset函数

memmove

memcpy的进阶版,它处理的源内存块和⽬标内存块是可以重叠的

void * memmove ( void * destination, const void * source, size_t num );

使用方法和memcpy一样,而且更好用,所以如果要用这个功能的话就用memmove就行

memset

是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。

void * memset ( void * ptr, int value, size_t num );
#include <stdio.h>
#include <string.h>
int main ()
{char str[] = "hello world";memset (str,'9',6);printf(str);return 0;
}

在这里插入图片描述
今天的分享就到这里了~
在这里插入图片描述

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

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

相关文章

verilog 从入门到看得懂---verilog 的基本语法数据和运算

笔者之前主要是使用c语言和matab 进行编程&#xff0c;从2024年年初开始接触verilog&#xff0c;通过了一周的学习&#xff0c;基本上对verilog 的语法有了基本认知。总统来说&#xff0c;verilog 的语法还是很简单的&#xff0c;主要难点是verilog是并行运行&#xff0c;并且强…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:TabContent)

仅在Tabs中使用&#xff0c;对应一个切换页签的内容视图。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 支持单个子组件。 说明&#xff1a; 可内置系统组件和自定义组件&#xff0c;支…

浏览器同源策略及跨域问题

同源策略&#xff1a;同源策略是一个重要的安全策略&#xff0c;它用于限制一个源的文档或者它加载的脚本如何能与另一个源的资源进行交互。它能帮助阻隔恶意文档&#xff0c;减少可能被攻击的媒介。 同源策略的作用&#xff1a;保护浏览器中网站的安全&#xff0c;限制ajax只…

0基础 三个月掌握C语言(11)

字符函数和字符串函数 为了方便操作字符和字符串 C语言标准库中提供了一系列库函数 接下来我们学习一下这些函数 字符分类函数 C语言提供了一系列用于字符分类的函数&#xff0c;这些函数定义在ctype.h头文件中。这些函数通常用于检查字符是否属于特定的类别&#xff0c;例如…

【教学类-34-10】20240313 春天拼图(Midjounery生成线描图,4*4格拼图块)(AI对话大师)

作品展示&#xff1a; 背景需求&#xff1a; 利用华文彩云空心字&#xff08;粗胖字体。凑满9个拼图&#xff09;制作了3*3的拼图块 【教学类-34-09】20240310华文彩云学号拼图&#xff08;3*3格子浅灰底图 深灰拼图块&#xff09;&#xff08;AI对话大师&#xff09;-CSDN博…

Gitlab光速发起Merge Request

前言 在我们日常开发过程中需要经常使用到Merge Request&#xff0c;在使用过程中我们需要来回在开发工具和UI界面之前来回切换&#xff0c;十分麻烦。那有没有一种办法可以时间直接开发开工具中直接发起Merge Request呢&#xff1f; 答案是有的。 使用 Git 命令方式创建 Me…

前端基础——HTML傻瓜式入门(1)

该文章Github地址&#xff1a;https://github.com/AntonyCheng/html-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.c…

算法思想总结:滑动窗口算法

创作不易&#xff0c;感谢三连 一.长度最小的数组 . - 力扣&#xff08;LeetCode&#xff09;长度最小的数组 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int lenINT_MAX,nnums.size(),sum0;//len必须要给一个很大的数&#xf…

Xcode 15.3 Archive失败

Xcode 15.3 Archive失败 背景 升级 Xcode 到 15.3&#xff0c;真机运行正常。打包的时候发现 Archive 失败。 提示&#xff1a; Call parameter type does not match function signature! 仔细看报错里是和HandyJSON相关的提示。 解决 起初以为和 Pod 库有关系&#xff0c;…

实现更高能效的汽车级低边驱动器NRVB140ESFT1G 带温度和电流限制 自保护低压侧驱动器

一起去了解关于汽车电子AEC Q101车规认证&#xff01;&#xff01;! 是一种针对分立半导体的可靠性测试认证程序&#xff0c;由汽车电子协会发布。这个认证程序主要是为了确保汽车电子产品在各种严苛的条件下能够正常工作和可靠运行。它包括了对分立半导体的可靠性、环境适应性…

【计算机网络】什么是http?

​ 目录 前言 1. 什么是HTTP协议&#xff1f; 2. 为什么使用HTTP协议&#xff1f; 3. HTTP协议通信过程 4. 什么是url&#xff1f; 5. HTTP报文 5.1 请求报文 5.2 响应报文 6. HTTP请求方式 7. HTTP头部字段 8. HTTP状态码 9. 连接管理 长连接与短连接 管线化连接…

python 爬取人民新闻

基础信息获取&#xff1a; 要闻url&#xff1a;https://www.gov.cn/yaowen/liebiao/home.htm 下一页的url&#xff1a;https://www.gov.cn/yaowen/liebiao/home_1.htm 基础代码&#xff1a; import re import openpyxl import requests from lxml import etree import osdef …

html--宠物

文章目录 htmljscss html <!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>CodePen - Spaceworm</title><script> window.requestAnimFrame (function() {return (window.requestAnimat…

llm综述

1、语言模型进程 1.1、语言模型概述 语言模型从统计语言模型&#xff08;SLM&#xff09;逐步发展为神经语言模型&#xff08;NLM&#xff09;&#xff1b;近年&#xff0c;通过在大规模语料库上对 Transformer 模型进行预训练&#xff0c;预训练语言模型(Pre-training Langu…

国际前十正规外汇实时行情走势app软件最新排名(综合版)

外汇交易&#xff0c;作为当今世界金融市场上一个重要的板块&#xff0c;备受关注和热议。随着金融市场的日益发展&#xff0c;外汇交易也发展成为一个新兴的投资交易渠道。为了更好地满足投资者对外汇市场的需求&#xff0c;外汇实时行情走势app软件应运而生&#xff0c;它为投…

MyFileServer

靶场下载地址 https://download.vulnhub.com/myfileserver/My_file_server_1.ova 信息收集 # nmap -sn 192.168.56.0/24 -oN live.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-24 22:07 CST Nmap scan report for 192.168.56.2 (192.168.56.2) Host is up (0.…

外包干了9天,技术退步明显。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;2018年我通过校招踏入了南京一家软件公司&#xff0c;开始了我的职业生涯。那时的我&#xff0c;满怀热血和憧憬&#xff0c;期待着在这个行业中闯出一片天地。然而&#xff0c;随着时间的推移&#xff0c;我发现自己逐渐陷入…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Tabs)

通过页签进行内容视图切换的容器组件&#xff0c;每个页签对应一个内容视图。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 该组件从API Version 11开始默认支持安全区避让特性(默认值为&#x…

在Linux中进行OpenSSH升级

由于OpenSSH有严重漏洞&#xff0c;因此需要升级OpenSSH到最新版本。 OpenSSL和OpenSSH都要更新&#xff0c;OpenSSH依赖于OpenSSL。 第一步&#xff0c;查看当前的OpenSSH服务版本。 命令&#xff1a;ssh -V 第二步&#xff0c;安装、启动telnet&#xff0c;关闭安全文件&a…

【Linux】基础 IO(文件描述符)-- 详解

一、前言 1、文件的宏观理解 文件在哪呢&#xff1f; 从广义上理解&#xff0c;键盘、显示器、网卡、声卡、显卡、磁盘等几乎所有的外设都可以称之为文件&#xff0c;因为 “Linux 下&#xff0c;一切皆文件”。 从狭义上的理解&#xff0c;文件在磁盘&#xff08;硬件&#…