字符串与内存函数

简介: 字符串与内存函数

一、字符串

在c语言中是没有字符串类型的,并且字符串这种类型处理起来是非常繁琐的,字符串一般是放在常量字符串中的或者字符数组中,所以这里一般是引用库函数去使用字符串函数中,今天这篇文章中,将介绍几个常用的函数,如:strlen、strcpy、strcat、strcmp等等。

二、字符串函数介绍以及使用

1、strlen

size_t strlen ( const char * str );

求字符串的长度,这个函数的用法是以'\0'为结束标志,返回的是'\0'前面的字符个数,不包含'\0',所指向的字符串必须包含'\0',返回的函数是size_t是无符号的,这个一定要注意。

如上图是strlen函数的使用,好了,会使用stren这个函数了,根据他的原理可以写出来一个自己的求字符串函数了。根据查看字符串'\0',把字符串的首元素地址传递进my_strlen这个函数中,用str1去接受字符串的首元素地址,然后利用断言assert去判断这个字符串是不是空地址,然后在进行判断字符串中字符的数量,在最后去返回字符的数量。

2、strcpy

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

这个函数是将source里面的数据拷贝到destination的空间中,但是一定要注意目标空间也就是destination中的空间充足,而且源空间也必须是以'\0'为结束标志,而且还要把'\0'复制到目标空间,在返回目标空间的首元素地址。

接着我们来实现自己写的strcpy的模拟实现,首先还是接收传进函数中的两个字符串数组的首元素地址,然后进行断言判断,在循环进行把源空间里面的数据传递到目标空间中,最后再把目标空间首元素的地址返还回去。

3、strcat

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

这个函数的用法就是把源空间里面的数据追加在目标空间后面,但是还是以'\0'为标志,追加的位置是在目标空间的'\0'后面,并且源空间的数据也是以'\0'为结束标志,并且目标空间的空间必须足够大。

一如上文所示,我将再次根据这个函数的原理去模拟实现一个自己的函数,首先还是先把数据地址进行传递,紧接着就是用断言函数进行判断,这里和上文都是一样的用const去修饰源空间,以防更改源空间的数据,然后在进行判断追加,,首先是用while函数进行把目标空间的数据地址先++到'\0'的地址,然后再把源空间的数据放入目标空间的地址,追后在返回首元素的地址。

4、strcmp

int strcmp ( const char * str1, const char * str2 );

这个函数就是判断字符串的大小,首先去根据两个字符串的首元素地址的数据向后一个个去判断,也就是相当于判断当前字符的ASCLL码的数据大小。当第一个字符串的小于第二个字符串时返回小于0的数值,相等就是返回0,第一个字符串大于第二个字符串时返回1。

然后接着就是模拟实现了,这个比上面的函数模拟实现要麻烦一点,首先还是assert断言去判断的两个字符串的地址,这里是利用while函数去判断两个字符串,循环是两个字符串相等时,判断字符串是否等于'\0',相等就返回0,不相等地址就+1,直到不相等时,首先判断str1是否大于str2,如果大于的话就返回1,否则就返回-1。

5、strstr

char * strstr ( const char *, const char * );

这个函数是查找后面的字符串是否是前面字符串的子串,并且返还从这个子串以及后面的字符串。

这个模拟实现有点麻烦,不过还是先把两个字符串传递到自定义的函数中,还是先断言,然后把两个字符串的地址先传给两个变量也就是s1和s2,再把str1的地址传递给cur,这个s1和s2是去判断str2字符串是否是str1的子串,cur是为了排除掉子串前面的字符,如果没有cur++,就是为了跳过前面的字符串,如果两个字符串的首字符字符相等后就进入while函数,两个字符串的地址开始++进行判断是否是子串,如果是就返回这时子串在第一个字符串的第一次出现的地方的地址,如果不是就返回NUll。

6、 strtok

char * strtok ( char * str, const char * sep );

这个函数大概就是分割, 第一个参数就是指向的字符串,这个字符串一般包含很多的分隔符,而且第一个函数不会时空指针,后面的就是分隔符,可以是“,”也可以是“-”等具体实现如下图。

如上图就是以".,-"这三个为切割符去切割这个字符串的。

7、strerror

char * strerror ( int errnum );

strerror就是播报错误的一个字符串函数,返回当前错误信息。应为编译器报错的一般都是错误代码,我们是看不懂的,所以就需要一个函数去输出转换成我们所能看懂的信息。

注意的是必须要包含头文件,也就是下面这个头文件。

#include <errno.h>

使用体现如下图,errno就是报告的错误代码。

8、memcpy

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

这个函数的组要用法就是从source的位置复制num个字节数据放到destination,这个函数与strcpy的不同处就是它遇到”\0“并不会停止,如果source和destination有任何的重叠,复制的结果都是未知的。

好了 我们就可以接着用自己的代码去实现这个函数了,首先把两个字符串传递过去,以及所需要赋值的字节数,然后进行断言判断两个字符串是否是空指针,然后进行while循环,每执行一次num就减减,也就是剩下的字节数,然后再把需要传递的字符串进行传递过去,在加加,因为我们传递的可能不止是字符串,所以就把他强转成字符型指针,这样就算别的类型也可以进行传参。

9、memmove

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

这个函数和memcpy区别不大,就是目标空间出现重叠时就使用这个函数,它可以处理目标空间重叠的传递。如图就复制在hello后面了,把空格顶掉。

 


目录
相关文章
TU^
|
3天前
|
C语言
C语言内存函数和字符串函数模拟实现
C语言内存函数和字符串函数模拟实现
TU^
8 0
|
5天前
|
编译器 C语言 C++
c语言常见字符函数、内存函数(详讲)
c语言常见字符函数、内存函数(详讲)
|
2天前
|
Java 编译器 C语言
深入了解字符(串)函数 -- -- 字符(串)函数的实现(strlen、strcpy、strcmp、strcat、strstr、)内存函数的实现(memcpy、memmove)
深入了解字符(串)函数 -- -- 字符(串)函数的实现(strlen、strcpy、strcmp、strcat、strstr、)内存函数的实现(memcpy、memmove)
9 0
|
3天前
|
C语言
c语言内存函数
c语言内存函数
10 0
|
3天前
|
C语言
c语言:字符串和内存函数介绍-2
c语言:字符串和内存函数介绍
6 0
|
3天前
|
C语言
c语言:字符串和内存函数介绍-1
c语言:字符串和内存函数介绍
10 0
|
4天前
|
安全 编译器 C语言
【C语言】字符串和内存函数的介绍 -- 详解
【C语言】字符串和内存函数的介绍 -- 详解
|
8天前
|
存储 算法 关系型数据库
实时计算 Flink版产品使用合集之在Flink Stream API中,可以在任务启动时初始化一些静态的参数并将其存储在内存中吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
22 4
|
9天前
|
存储 小程序 编译器
数据在内存中的存储(探索内存的秘密)
数据在内存中的存储(探索内存的秘密)
14 0
|
11天前
|
存储 监控 NoSQL
Redis处理大量数据主要依赖于其内存存储结构、高效的数据结构和算法,以及一系列的优化策略
【5月更文挑战第15天】Redis处理大量数据依赖内存存储、高效数据结构和优化策略。选择合适的数据结构、利用批量操作减少网络开销、控制批量大小、使用Redis Cluster进行分布式存储、优化内存使用及监控调优是关键。通过这些方法,Redis能有效处理大量数据并保持高性能。
34 0