从零开始的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

相关文章

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

MySQL中FIND_IN_SET函数与INSTR函数用法解析

《MySQL中FIND_IN_SET函数与INSTR函数用法解析》:本文主要介绍MySQL中FIND_IN_SET函数与INSTR函数用法解析,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一... 目录一、功能定义与语法1、FIND_IN_SET函数2、INSTR函数二、本质区别对比三、实际场景案例分

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序