当前位置:   article > 正文

string.h的部分函数使用及模拟实现_stm32 string.h 里的函数应用

stm32 string.h 里的函数应用


这篇文章主要介绍string.h头文件包含的部分函数,这些函数在使用的时候必须要包含头文件 string.h 。

strlen


strlen用于计算字符串的长度,strrlen的返回值类型是size_t,strlen的参数是一个字符指针,因为只会进行计算长度,不会对字符串进行更改,所以可以使用const,防止对str字符串进行修改,strlen会计算从字符指针指向的字符一直到 ‘\0’ ,总共有多少个字符,不包括 ‘\0’。

在strlen的使用中需要注意的是保证需要计算的字符串中必须有 ‘\0’,如果没有’\0’,strlen的结果就会是随机数。

strlen代码示例

#include <stdio.h>
#include <string.h>
int main()
{
   
	char arr[] = "abcdef";
	printf("%zd\n", strlen(arr));
	printf("%zd\n", sizeof(arr))
	char ch[] = {
   'a', 'b'};
	printf("%zd\n",strlen(ch));
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
arr[i] i ch[i]
a 0 a
b 1 b
c 2
d 3
e 4
f 5
\0 6

对数组arr来说,字符’a’,‘b’,‘c’,‘d’,‘e’,‘f’,'\0’都属于字符串“abcdef”在内存中存放的一部分,所以sizeof(arr)的结果是7,因为strlen只计算 ‘\0’ 之前的长度,所以strlen(arr)的结果是6。同理,可以计算得到 sizeof(ch) 的结果是2,因为strlen计算的是 ‘\0’ 之前的所有字符,而在ch中没有‘\0’,ch只有两个字符,我们无法得知‘\0’的位置,所以strlen(ch)的结果是随机的。

运行结果
在这里插入图片描述

strlen的模拟实现

第一种方式(循环)

int my_strlen1(const char* str)
{
   
	assert(str);
	int count = 0;
	while (*str)
	{
   
		str++;
		count++;
	}
	return count;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在my_strlen1中先定义一个int类型的计数变量,当 *str != ‘\0’ 时,str++,count++, str指向下一个字符,当 *str == ‘\0’ 时,循环结束,返回count,此时的count就是字符串的长度。

第二种方式(递归)

int my_strlen2(const char* str)
{
   
	int count = 0;
	if(*str)
	{
   
		return my_strlen2(str+1)+1;
	}
	return count;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

my_strlen2函数使用的是递归的方式,先定义一个int类型的计数变量,当 *str != ‘\0’ 时,return my_strlen2(str+1) + 1,也就是对str+1所指向的字符进行计算并且 + 1,只要不为 ‘\0’ ,递归就能继续,返回值就+1,当 *str == ‘\0’ 时,return此时的count,递归结束。

第三种方式(指针 - 指针)

int my_strlen3(const char* str)
{
   
	char* s = str;
	while(*str)
	{
   
		str++;
	}
	return str - s;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

my_strlen3首先使用 char* 类型的变量 s 来标记起始指针的位置,然后让 str 在 *str != ‘\0’ 时,一直向后移动,当 *str == ‘\0’ 的时候,循环结束,此时,str指向 ‘\0’ ,而s 指向字符串的起始地址,返回 str - s的值,也就得到了 ‘\0’ 前面的字符个数。

#include <stdio.h>
#include <string.h>

int my_strlen1(const char*);
int my_strlen2(const char*);
int my_strlen3(const char*);
int main()
{
   
	char arr[] = "abcdef";
	printf("%zd\n", strlen(arr));
	printf("%zd\n", my_strlen1(arr));
	printf("%zd\n", my_strlen2(arr));
	printf("%zd\n", my_strlen3(arr));
	char ch[] = {
   'a', 'b'};
	printf("%zd\n",strlen(ch));
	printf("%zd\n",my_strlen1(ch));
	printf("%zd\n",my_strlen2(ch));
	printf("%zd\n",my_strlen3(ch));

	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

代码运行结果
在这里插入图片描述

strcpy与strncpy

在这里插入图片描述
strcpy用于拷贝字符串,也就是将source字符串拷贝到字符串destination,前提是destination字符串的长度不小于source字符串,拷贝的方式是直接从 destination指向的位置开始覆盖,在使用的时候可以通过更改destination的值来进行从不同位置的拷贝,strcpy拷贝的字符包括最后的 ‘\0’ ,返回值的类型是char*,返回的是传入strcpy的destination,因为destination字符串需要进行更改,所以不能在destination的前面加上const进行限定,因为source字符串不需要进行更改,所以source字符串可以加上const进行限定。

在这里插入图片描述
strncpy与strcpy十分相似,只是多了一个数字num来控制拷贝的字符个数。如果num大于字符串的长度,该函数会自动添加 ‘\0’ ,如果num小于字符串的长度,并不会在最后添加’\0’,只会拷贝相应数字的字符。

strcpy与strncpy代码示例

#include <stdio.h>
#include <string.h>

int main()
{
   
	char arr1[] = "abcd";
	char arr2[10] = "xxxxxxxxx";//10个元素包括了末尾的'\0',所以最多只有9个x

	strcpy(arr2, arr1);
	strncpy(arr2, "456", 2);
	strncpy(arr2, "12", 5);

	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

调试图

char arr2[10] = "xxxxxxxxx";
  • 1

初始化arr2时的每个元素。
在这里插入图片描述

strcpy(arr2, arr1);
  • 1

将arr1中的每个元素都拷贝到arr2中,可以看到图中红色的都是arr2中的元素变化。

strncpy(arr2, "456", 2);
  • 1

将字符串"456"中的前两个字符拷贝到arr2中,可以看到arr2中的字符串变化,只改变了前两个字符,并没有添加’\0’。

strncpy(arr2, "12", 5);
  • 1

当数字大于字符串的字符个数时,strncpy()会直接在后面加上’\0’,如下图所示,显示发生变化的字符只有四个,这是因为之前就已经将 arr[4] 改为了’\0’。

strcpy的模拟实现

char* my_strcpy(char* dest, const char* src)
{
   
	char* ret = dest;
	while (*dest++ = *src++)
	{
   
		;
	}
	return ret;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

先定义一个char*类型的变量来存放dest的起始地址,再用while循环来对dest对应的字符进行赋值,将dest对应的字符赋值成src,然后指针 dest 和 src 都向后移动,然后再赋值,直到 src 到字符串的末尾,也就是 src 变为 ‘\0’,然后将 * dest 赋值成 ‘\0’ ,此时,因为dest='\0’表达式的结果为假,所以循环条件不再成立,循环结束

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/713611
推荐阅读
相关标签
  

闽ICP备14008679号