字符串与内存函数

简介: 字符串与内存函数

一、字符串

在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后面了,把空格顶掉。

 


目录
相关文章
|
2月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
37 3
|
9天前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
34 6
|
28天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
45 6
|
2月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
2月前
|
存储 程序员 编译器
C语言——动态内存管理与内存操作函数
C语言——动态内存管理与内存操作函数
|
2月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
263 1
|
2月前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
32 0
|
2月前
|
C语言 C++
c语言回顾-内存操作函数
c语言回顾-内存操作函数
41 0
|
2月前
|
存储 C语言 C++
来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp
本文详细介绍了C语言中的四个内存操作函数:memcpy用于无重叠复制,memmove处理重叠内存,memset用于填充特定值,memcmp用于内存区域比较。通过实例展示了它们的用法和注意事项。
73 0
|
2月前
一刻也没有为它哀悼~接下来登场的是动态内存分配的malloc与realloc以及free函数
一刻也没有为它哀悼~接下来登场的是动态内存分配的malloc与realloc以及free函数
78 0