从零开始的c语言日记day40——字符函数和字符串函数——内存函数

2023-12-07 11:52

本文主要是介绍从零开始的c语言日记day40——字符函数和字符串函数——内存函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 常用函数介绍

求字符串长度

strlen

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

Strcpy

Strcat

strcmp

长度受限制的字符串函数介绍

 strncpy

 strncat

strncmp

字符串查找

Strstro

 strtok

错误信息报告

strerror

字符操作

内存操作函数

memcpy

memmove

memset

Memcmp

使用Assert断言必须调用头文件<assert.h>

  • Strlen

字符串已经"\0'作为结束标志,strlen函数返回的是在字符串中’\0’前面出现的字符个数(不包含’\0’)。

参数指向的字符串必须要以’\0’结束

注意函数的返回值为size_t,是无符号的(易错)

学会strlen函数的模拟实现

格式:size_t strlen ( const char* str))

注意不能直接用strlen相减这种写法如果减到负数,strlen返回结果是无符号整形,两个相减返回的值也是无符号整形,如果-3当成一个无符号整形他的补码存到内存里是一个很大的正数。

可以改为比较

用循环找到\0为止的方法计算字符个数

Assert(str):保证指针不能为空是有效的

  • Strcpy

格式:char* strcpy(char * destination,const char * source );

Destination:目的地

Source:源头

·源字符串必须以'\0’结束。

·会将源字符串中的'\0'拷贝到目标空间。

·目标空间必须足够大,以确保能存放源字符串。

目标空间必须可变。

不能写成name=“zhangsan”因为name数组名是地址,地址是一个常量值不能被赋值

Strcpy拷贝到\0就停下来了自己加的\0也算

而且拷贝的东西必须包含\0,strcpy是找到\0才停止。

函数模拟实现

  • Strcat

格式:char * strcat ( char * destination,const char * source );

·源字符串必须以‘\0'结束。

·目标空间必须有足够的大,能容纳下源字符串的内容。

·目标空间必须可修改。

。空符串白己给白己追加.如何?

  1. 想要追加字符必须先找到被追加对象的结尾,也就是\0
  2. 自己不能给自己追加
  • Strcmp

比较两个数组相等

此程序无论两个数组内容是否一样,判断的结果都是不等于,因为比较的是地址。那使用strcmp函数如何做?

Strcmp比较的是数组\0的位置,第一个数组和第二个数组比较,谁先到\0因为\0的ascll码肯定比字符的小,所以就可以判断了。如果大于返回1小于返回-1等于返回0

自己写strcmp程序模拟

函数越界

Strcpy不看数组大小如果运行就会越界,这是函数设计时候的缺陷。vs软件提供自己的函数strcpy_s但是这个函数只有vs可以用。

程序之所以可以运行是因为开头定义了#define _CRT_SECURE_NO_WARNINGS 1

所以c语言提供了一种长度限制的版本函数

Strncpy

Strncat

Strncmp

多了一个num

只拷贝了5个字hello而f正好留下了

  • Strstr

C 库函数 char *strstr(const char *haystack, const char *needle) 在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\

模拟函数实现

  • Strtok

格式:char * strtok ( char * str,const char * sep );


sep参数是个字符串,定义了用作分隔符的字符集合,把需要用的分隔符都放进去
第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针。

(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
如果字符串中不存在更多的标记,则返回NULL指针。

但是这样写的代码很死板,实际并不知道有多少个地方需要分割

初始化只需要一次,一次过后只需要看ret不等于空指针,循环一次之后再调用一次这次需要空指针不要传cp了(NULL,sep)

  • Strerror

返回的错误码

如果没有这个文件则会返回一个错误值:No such file or directory

文件正常打开才会没有报错

函数

如果他的参数符合下列条件就返回真

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

任何可打印字符,包括图形字符和空白字符

判断是不是数字字符,是就返回非0值,如果不是返回0

  • Memcpy

内存拷贝

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

Memcpy(arr2,arr1,)

希望数据放到arr2,数据来自arr1,拷贝多少个整形7个就是28

用ret先储存arr2的首地址,因为执行玩之后arr2以及走到后面了。

而while的值就是具体想要cpy的值

循环第一行如果用(int*)我们只拷贝19个字节到后面会剩3个,所以用char一个一个来

memcpy函数是不用来处理重叠的内存之间的数据拷贝的

使用memmove函数来实现,重叠内存之间的数据拷贝

  • Memmove

C 库函数 void *memmove(void *str1, const void *str2, size_t n) 从 str2 复制 n 个字符到 str1,但是在重叠内存块这方面,memmove() 是比 memcpy() 更安全的方法。如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。

参数

str1 -- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。

str2 -- 指向要复制的数据源,类型强制转换为 void* 指针。

n -- 要被复制的字节数。

返回值

该函数返回一个指向目标存储区 str1 的指针。

  • Memcmp

描述

C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1。

声明

下面是 memcpy() 函数的声明。

void *memcpy(void *str1, const void *str2, size_t n)

参数

str1 -- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。

str2 -- 指向要复制的数据源,类型强制转换为 void* 指针。

n -- 要复制的字节数。

返回值

该函数返回一个指向目标存储区 str1 的指针。

一个一个比较,当到第二位的时候比较2和3,2小于3所以小于-1

  • Memset

描述

C 库函数 void *memset(void *str, int c, size_t n) 复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。

声明

下面是 memset() 函数的声明。

void *memset(void *str, int c, size_t n)

参数

str -- 指向要填充的内存块。

c -- 要被设置的值。该值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符形式。

n -- 要被设置为该值的字符数。

以上程序都没有问题,但以下这个程序有什么问题?

提供调试看到

Memset是把每一个字节都变成了1,因为这个函数是以字节位单位的,不能直接用整形

这篇关于从零开始的c语言日记day40——字符函数和字符串函数——内存函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/465778

相关文章

C语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

详解MySQL中JSON数据类型用法及与传统JSON字符串对比

《详解MySQL中JSON数据类型用法及与传统JSON字符串对比》MySQL从5.7版本开始引入了JSON数据类型,专门用于存储JSON格式的数据,本文将为大家简单介绍一下MySQL中JSON数据类型... 目录前言基本用法jsON数据类型 vs 传统JSON字符串1. 存储方式2. 查询方式对比3. 索引

java内存泄漏排查过程及解决

《java内存泄漏排查过程及解决》公司某服务内存持续增长,疑似内存泄漏,未触发OOM,排查方法包括检查JVM配置、分析GC执行状态、导出堆内存快照并用IDEAProfiler工具定位大对象及代码... 目录内存泄漏内存问题排查1.查看JVM内存配置2.分析gc是否正常执行3.导出 dump 各种工具分析4.