C语言中的字符与字符串函数一把梭

发布时间:2023-04-05 17:30

目录

一、求字符串长度

1、strlen库函数如何使用?

2.如何模拟实现strlen函数

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

1.库函数 strcpy 如何使用?

2.如何模拟实现 strcpy 函数?

3.库函数 strcmp 如何实现?

4.strcmp 函数如何模拟实现?

5. 库函数 strcat 的使用

6. 如何模拟实现 strcat 

三、长度受限制的字符串函数

1. strncpy - 长度受限制的字符串拷贝函数

2.strncat - 长度受限制的字符串追加函数

3.strncmp - 长度受限制的字符串比较函数

四、字符串查找

1.strstr 如何使用呢?

2.strstr 模拟实现

3.strtok 字符串切割函数

五、错误信息报告

六、字符操作

七、内存操作函数

1.memcpy内存拷贝函数如何使用呢?

2.模拟实现 memcpy

3.重叠内存之间的数据拷贝

4.memmove 模拟实现

5.内存比较

6.内存设置


一、求字符串长度

strlen专门用来求字符串长度的函数(这里的长度指的是字符串字符的个数)。

1、strlen库函数如何使用?

#include
#include

int main()
{
    char arr[] = "abcdef";
    int len = strlen(arr);
    printf("%d\n", len);
    return 0;
}

输出结果:

 为什么会输出 6 呢?

解释:

strlen 从arr数组的第一个字符开始计算,遇到一个字符,个数加1,直到计算所有的字符后结束。

注意:字符串的结束标志是 '\0' ,计算字符串长度时不会计算 '\0' ,只会计算 '\0' 之前的字符。

strlen库函数的使用需要引用头文件!

2.如何模拟实现strlen函数

#include
#include

size_t my_strlen(const char* arr)
{
	assert(arr);
	size_t count = 0;
	while (*arr != '\0')
	{
		count++;
		arr++;
	}
	return count;
}

int main()
{
	char arr[] = "abcdef";
	int ret = my_strlen(arr);
	printf("%d\n", ret);
	return 0;
}

这个代码求的是arr数组的长度,结果是6。

assert(arr);这一句是断言,为的是确保数组首元素的地址传过来的时候不是一个 NULL

assert 函数的头文件:

count 记录的是字符个数,所以返回 count 就是返回字符串长度。

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

strcpy:字符串拷贝函数,专门用来拷贝字符串内容的函数。(将源空间的内容拷贝到目标空间)

1.库函数 strcpy 如何使用?

#include
#include

int main()
{
	char arr1[20] = { 0 };
	char arr2[] = "I love China!";
	strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

strcpy 的第一个参数(arr1)表示目标空间第二个参数(arr2)表示源空间

它的头文件是:

代码的作用是将字符串 "I love China!" 拷贝到arr1中并打印出来。

输出结果:

  

 注意:strcpy 只是将目标空间的内容覆盖,自身源空间的内容并不会改变。

2.如何模拟实现 strcpy 函数?

#include
#include

char* my_strcpy(char* dest, const char* src)
{
	assert(dest && src);
	char* ret = dest;
	while (*src)
	{
		*dest++ = *src++;
	}
	*dest = *src;//'\0'
	return ret;
}

int main()
{
	char arr1[20] = { 0 };
	char arr2[] = "I love China!";
	my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

我们并不会改变源空间,所以加上 const 在我们不小心将其修改的时候对其进行保护。

代码的含义是:

        先将 dest 最开始指向的内容赋给 ret ,作为目标空间起始地址;*dest++ = *src++; 是将目标空间的字符给改成源空间的字符,直到源空间的字符全部改完。++ 就是指向下一个内容; src 是源空间拷贝结束后会指向 arr2 末尾的 '\0',*dest = *src; 就是将此时 src 指向的内是('\0') dest

3.库函数 strcmp 如何实现?

strcmp: 字符串比较函数,专门用来比较字符串内容的函数。

注意:字符串比较,比的是相同位置字符的 ASCII 码值的大小

例如:

char arr1[] = "abcde";
char arr2[] = "abcfg";

a, b, c 的 ASCII 码值一样大,所以前三个字符是相同大小的,比到第4个字符的时候,f 的 ASCII 码值大于 d ,所以 arr2 要大于 arr1

这个函数有两个参数,分别是要比较的字符串的地址。返回类型是 int 。

C语言中的字符与字符串函数一把梭_第1张图片

 返回值的解释:

如果第一个字符串小于第二个字符串,就返回 小于0 的数字;如果第一个字符串等于第二个字符串,就返回 0 ;如果第一个字符串大于第二个字符串,就返回 大于0 的数字;

#include
#include

int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abc";
	int ret = strcmp(arr1, arr2);
	if (0 > ret)
	{
		printf("arr1 < arr2");
	}
	else if (0 == ret)
	{
		printf("arr1 == arr2");
	}
	else
	{
		printf("arr1 > arr2");
	}
	return 0;
}

strcmp 的头文件

输出结果:

C语言中的字符与字符串函数一把梭_第2张图片

4.strcmp 函数如何模拟实现?

#include
#include

int  my_strcmp(const char* arr1, const char* arr2)
{
	assert(arr1 && arr2);
	while (*arr1 == *arr2)
	{
		//等于的情况
		if (*arr1 == '\0')
		{
			return 0;
		}
		arr1++;
		arr2++;
	}
	return (*arr1 - *arr2);
}

int main()
{
	char arr1[] = "abcd";
	char arr2[] = "abcd";
	int ret = my_strcmp(arr1, arr2);
	if (ret < 0)
	{
		printf("arr2 < arr1");
	}
	else if (ret == 0)
	{
		printf("arr2 == arr1");
	}
	else
	{
		printf("arr2 > arr1");
	}
	printf("%d\n", ret);
	return 0;
}

       当比较的字符相等时而且还未遇到结尾,循环和 ++ 操作符就可以指向下一个字符并比较,直到遇到末尾的 \0 。如果arr1指向了 \0 则说明两个字符串的所有字符都比较过了,结果还是相等,然后返回0。当比较出大小的时候,就返回 arr1 指向的内容减去 arr2 指向的内容。如果 arr1 大于 arr2 ,返回的就是大于 0 的数字,反之就是小于。

   

C语言中的字符与字符串函数一把梭_第3张图片

长度不受限制就是再使用的时候,不能限制进行操作的字符个数,一直操作到 \0 为止;长度受限制相反,我们可以限制操作的字符个数。

在使用的时候建议使用长度受限制的字符串函数,因为当目标空间不够的时候,我们进行字符串拷贝、追加会因为空间不够而造成出错。

5. 库函数 strcat 的使用

strcat : 字符串追加函数,专门用来追加字符串内容的函数。(将一段字符追加到目标空间)

strcat 的头文件

#include
#include

int main()
{
	char arr[20] = "hello ";
	strcat(arr, "world");
	printf("%s\n", arr);
	return 0;
}

代码的作用是将 world 追加到 arr 字符串的末尾。

 输出结果:

6. 如何模拟实现 strcat 

#include
#include

char* my_strcat(char* dest, const char* src)
{
	assert(dest && src);
	char* ret = dest;
	while (*dest != '\0')
	{
		dest++;
	}
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

int main()
{
	char arr[20] = "hello ";
	my_strcat(arr, "world");
	printf("%s\n", arr);
	return 0;
}

一个参数依然是表示目标空间第二个参数表示源空间,代码的作用是将源空间的每一个字符都拷贝到目标空间,这和 strcpy 有些类似。

C语言中的字符与字符串函数一把梭_第4张图片

第一个循环为的是找到目标字符串的结尾,第二个循环为的是将源空间的字符拷贝到目标字符串的后面。 

三、长度受限制的字符串函数

1. strncpy - 长度受限制的字符串拷贝函数

 这个函数的参数有三个,前两个是要操作的字符串,第三个参数是你要拷贝多少个字节。

#include
#include

int main()
{
	char arr1[] = "hello";
	char arr2[] = "abcdefg";
	strncpy(arr1, arr2, 5);
	printf("%s", arr1);
	return 0;
}

arr1是目标空间, arr2是源空间,5是要拷贝的字节数,因为一个字符是一个字节;所以这段代码的含义是:将 arr2 数组的前5个字符拷贝到 arr1 数组中。

代码结果:

  

注意:当我们要拷贝的字节数大于源空间的字节数时,差几个字节就拷贝几个 '\0' 到目标空间去。

C语言中的字符与字符串函数一把梭_第5张图片

2.strncat - 长度受限制的字符串追加函数

这个函数的参数有三个,前两个是要操作的字符串,第三个参数是你要追加多少个字节。

#include
#include

int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "world";
	strncat(arr1, arr2, 5);
	printf("%s", arr1);
	return 0;
}

 代码结果:

arr1是目标空间, arr2是源空间,5是要追加的字节数,因为一个字符是一个字节;所以这段代码的含义是:将 arr2 数组的5个字符追加到 arr1 数组中。

注意: 值得注意的是在要追加的内容完成后还会追加一个 \0 ,因为补上一个 \0 才能是作为一个字符串存在。

C语言中的字符与字符串函数一把梭_第6张图片

 

注意:当我们要拷贝的字节数大于源空间的字节数时,不会像strcpy那样拷贝 \0 过去。 

3.strncmp - 长度受限制的字符串比较函数

 这个函数的参数也有三个,前两个是要比较的字符串,第三个参数是你要比较多少个字节。

#include
#include

int main()
{
	char arr1[20] = "abcdef";
	char arr2[] = "abcdf";
	int ret = strncmp(arr1, arr2, 5);
	if (ret > 0)
	{
		printf("arr1 > arr2");
	}
	else if (ret < 0)
	{
		printf("arr1 < arr2");
	}
	else
	{
		printf("arr1 == arr2");
	}
	return 0;
}

arr1是要比较的第一个字符串, arr2是要比较的第二个字符串,5是要比较的字节数,因为一个字符是一个字节;所以这段代码的含义是:比较 arr2 和 arr1 数组的前5个字符的大小。

代码结果:

四、字符串查找

strstr :是一个查找子串的函数,就是在一个字符串中查找了一个字符串存不存在。

1.strstr 如何使用呢?

        这个函数有两个参数,第一个参数是比较长的串,第二个是子串;函数的目的是要在这个比较长的串中查找子串是否存在。如果找到了子串会返回子串在长串的起始位置,找不到则返回一个空指针


#include
#include

int main()
{
	char arr1[] = "abcdefg";
	char arr2[] = "cde";
	char* ret = strstr(arr1, arr2);
	if (ret == NULL)
	{
		printf("子串不存在\n");
	}
	else
	{
		printf("%s\n", ret);
	}
	return 0;
}

子串如果存在,代码会打印从子串起始位置到 \0 的字符。

strstr 的头文件:

代码结果:

C语言中的字符与字符串函数一把梭_第7张图片

2.strstr 模拟实现

可能遇到的两种情况:

情况1

这一种情况是最简单的。

C语言中的字符与字符串函数一把梭_第8张图片

情况2

C语言中的字符与字符串函数一把梭_第9张图片

       值得注意的是,当s2全都对比过后还没有查找到,而且s1还有字符为对比过,则就要把s2重置到起始位置,把s1重置到第一次与s2相等的后面的字符,然后从这里开始对比,直到结束。 

代码实现:

#include
#include
#include

char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	const char* p = str1;
	const char* s1 = str1;
	const char* s2 = str2;
	while (*p)
	{
		s1 = p;
		s2 = str2;
		while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return (char*)p;
		}
		p++;
	}
	return NULL;
}

int main()
{
	char arr1[] = "abcdefg";
	char arr2[] = "cde";
	char* ret = my_strstr(arr1, arr2);
	if (ret == NULL)
	{
		printf("子串不存在\n");
	}
	else
	{
		printf("%s\n", ret);
	}
	return 0;
}

3.strtok 字符串切割函数

字符串切割函数,把你想要的内容给切割出来。

这个函数有两个参数,返回类型是 char*

  • sep 参数是是个字符串,定义了用作分隔符的字符集合。

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号