全网最详细的字符串函数介绍---strcpy、strcat、strcmp

文章目录

  • 一、strcpy--字符串拷贝
    • 1.函数介绍
    • 2.模拟实现
  • 二、strcat--字符串追加
    • 1.函数介绍
    • 2.模拟实现
  • 三、strcmp--字符串比较
    • 1.函数介绍
    • 2.模拟实现
  • 四、strcpy、strcat、strcmp--可限制操作长度
    • 1.strcpy
    • 2.strcat
    • 3.strcmp

一、strcpy–字符串拷贝

1.函数介绍

char *strcpy( char *Destination, const char *Source );

strcpy函数是一个用于拷贝字符串的函数,即将一个字符串中的内容拷贝到另一个字符串中(会覆盖原字符串内容)。它的参数是两个指针,第一个指向的是拷贝字符串的目的地的起始位置,即要将字符串拷贝到什么地方;第二个指向的是要拷贝字符串的内容的起始位置,即需要拷贝的字符串。它的返回值是目标空间的起始位置。

注意:

  1. 源字符串(需要被拷贝的字符串)必须以’\0’结束。
  2. 会将源字符串中的’\0’一同拷贝到目标空间。
  3. 目标空间必须足够大,以确保能存放源字符串。
  4. 目标空间必须可变。

举个例子,比如我们要将arr2数组中的"def"拷贝到arr1数组中。

#include
#include
int main()
{
	char arr1[10] = "abc";
	char arr2[] = "def";
	strcpy(arr1, arr2);
	return 0;
}

注意:拷贝结束后arr1数组中只有"def",因为"abc"被覆盖了。

2.模拟实现

进入函数体时先定义一个指针变量保存目标空间的起始位置,便于之后返回。然后将源字符串中的字符一一赋值给目标空间,直到遇到源字符串中的’\0’,将’\0’也赋值给目标空间后结束赋值,并返回目标空间的起始位置。

char* my_strcpy(char* dest, char* src)
{
	char* ret = dest;//保存目标空间的起始位置
	assert(dest != NULL);//断言,dest为空指针时报错
	assert(src != NULL);//断言,src为空指针时报错
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

二、strcat–字符串追加

1.函数介绍

char *strcat( char *Destination, const char *Source );

strcat函数是一个用于追加字符串的函数,即将一个字符串中的内容追加到另一个字符串后面(不会覆盖原字符串内容)。它的参数是两个指针,第一个指向的是追加字符串的目的地的起始位置,即要将字符串追加到什么地方;第二个指向的是要追加字符串的内容的起始位置,即需要追加的字符串。它的返回值是目标空间的起始位置。

注意:

  1. 源字符串必须以’\0’结束。
  2. 目标空间必须足够大,能容纳下源字符串的内容。
  3. 目标空间必须可修改。
  4. 字符串不能给自己追加(’\0’被覆盖,无终止条件)。

举个例子,比如我们要将arr2数组中的"csdn!"追加到arr1数组的后面。

#include
#include
int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "csdn!";
	strcat(arr1, arr2);
	return 0;
}

追加结束后arr1数组中的内容变成"hello csdn!"。

2.模拟实现

进入函数体依然先定义一个指针变量用于存放目标空间的起始位置,便于之后返回。然后用循环先找到目标空间的’\0’,之后从’\0’的位置开始追加源字符串的内容,直到追加到源字符串中的’\0’为止。最后返回目标空间的起始位置。

char* my_strcat(char* dest, const char* src)
{
	assert(dest != NULL);//断言,dest为空指针时报错
	assert(src != NULL);//断言,src为空指针时报错
	char* ret = dest;
	//找到目标空间的'\0'
	while (*dest)
	{
		dest++;
	}
	//追加
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

三、strcmp–字符串比较

1.函数介绍

int strcmp( const char *string1, const char *string2 );


strcmp函数是一个用于比较两个字符串内容的函数。它的参数是两个指针,指针分别指向两个待比较字符串的起始位置。它的返回值是一个整型数字。当string1大于string2的时候返回一个大于0的数;当string1等于string2的时候返回0;当string1小于string2的时候返回一个小于0的数。

注意:

字符串比较的不是字符串长度的大小,而是两个字符串中对应位置字符的ASCII值。

举个例子,比如比较字符串"hello world!"和字符串"hello csdn!"的大小。

#include
#include
int main()
{
	char arr1[20] = "hello world!";
	char arr2[20] = "hello csdn!";
	int ret = strcmp(arr1, arr2);
	return 0;
}

比较字符串的时候发现前面字符的ASCII值都相同,直到比较到字符’w’和字符’c’时,发现字符’w’的ASCII值大于字符’c’的ASCII值,于是返回一个大于0的数。

2.模拟实现

进入函数体直接比较起始位置的字符的大小。如果相同并且不为’\0’那么继续比较下一对字符的大小;如果相同并且为’\0’那么说明字符串比较完毕,那么直接返回0;如果不同则直接返回str1与str2中对应字符的ASCII值的差值(当str1中对应字符大于str2中的对应字符时返回正值,当str1中对应字符小于str2中的对应字符时返回负值)。

int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 != NULL);//断言,str1为空指针时报错
	assert(str2 != NULL);//断言,str2为空指针时报错
	while (*str1 == *str2)
	{
		if (*str1 == '\0')//字符串全部比较完毕
			return 0;
		str1++;
		str2++;
	}
	return *str1 - *str2;
}

四、strcpy、strcat、strcmp–可限制操作长度

我们发现strcpy是将一个字符串全部拷贝到另一个字符串,strcat是将一个字符串全部追加到另一个字符串后面,strcmp也是比较两个字符串的全部内容,这类操作函数称为长度不受限制的字符串操作函数

那么我们如果操作字符串时并不想操作整个字符串,而只想操作字符串的一部分怎么办呢?
库函数中的strncpy、strncat、strncmp便解决了这个问题。

1.strcpy

char *strncpy( char *Dest, const char *Source, size_t count );

strncpy的参数与strcpy相比较多出了一个参数,而这个参数就是需要被操作的字符个数。

注意:

  1. 当操作数小于等于源字符串中的字符个数时,操作数的大小决定被拷贝的字符个数。
  2. 当操作数大于源字符串中字符的个数时,strncpy函数将源字符串中的字符拷贝到目标空间后不够的将用’\0’填充。

举个例子:

#include
#include
int main()
{
	char arr1[10] = "#########";
	char arr2[] = "abcd";
	strncpy(arr1, arr2, 3);
	strncpy(arr1, arr2, 6);
	return 0;
}

当操作数为3时,拷贝结束后arr1数组中存放的是"abc######“;而当操作数为6时,拷贝结束后arr1数组中存放的是"abcd\0\0###”。

2.strcat

char *strncat( char *Dest, const char *Source, size_t count );

strncat的参数与strcat相比较也多出了一个参数,而这个参数也就是需要被操作的字符个数。

注意:

  1. 当操作数小于源字符串中的字符个数时,操作数的大小决定被追加的字符个数,并在追加完后再追加一个’\0’。
  2. 当操作数大于等于源字符串中的字符个数时,将源字符串内容全部追加到目标空间便结束追加。

举个例子:

#include
#include
int main()
{
	char arr1[10] = "abc\0#####";
	char arr2[] = "def";
	strncat(arr1, arr2, 2);
	strncat(arr1, arr2, 5);
	return 0;
}

当操作数为2时,拷贝结束后arr1数组中存放的是"abcde\0###“;而当操作数为5时,拷贝结束后arr1数组中存放的是"abcdef\0##”。

3.strcmp

int strncmp( const char *string1, const char *string2, size_t count );

strncmp的参数与strcmp相比较也多出了一个参数,而这个参数也就是需要比较的字符个数。

举个例子:

#include
#include
int main()
{
	char arr1[] = "abcde";
	char arr2[] = "abcdf";
	int ret1 = strncmp(arr1, arr2, 4);
	int ret2 = strncmp(arr1, arr2, 5);
	return 0;
}

当操作数为4时,我们只比较了arr1和arr2的前4个字符,而它们前4个字符都相同,所以返回的是0;而当操作数为5的时候,我们比较了arr1和arr2的前5个字符,因为字符’e’的ASCII值小于字符’f’的ASCII值,所以返回一个负值。

你可能感兴趣的:(C语言详解,c语言)