字符串函数中的拷贝、追加和比较函数(strcpy,strcat,strcmp)

网友投稿 257 2022-09-18

字符串函数中的拷贝、追加和比较函数(strcpy,strcat,strcmp)

文章目录

​​一、strcpy - 字符串拷贝​​

​​1.函数介绍​​​​2.模拟实现​​

​​二、strcat - 字符串追加​​

​​1.函数介绍​​​​2.模拟实现​​

​​三、strcmp - 字符串比较​​

​​1.函数介绍​​​​2.模拟实现​​

​​四、strncpy、strncat、strncmp - 可限制操作长度​​

​​1.strncpy​​​​2.strncat​​​​3.strncmp​​

一、strcpy - 字符串拷贝

1.函数介绍

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

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

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

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

#include#includeint 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函数是一个用于追加字符串的函数,即将一个字符串中的内容追加到另一个字符串后面(不会覆盖原字符串内容)。它的参数是两个指针,第一个指向的是追加字符串的目的地的起始位置,即要将字符串追加到什么地方;第二个指向的是要追加字符串的内容的起始位置,即需要追加的字符串。它的返回值是目标空间的起始位置。注意:

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

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

#include#includeint 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#includeint 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;}

四、strncpy、strncat、strncmp - 可限制操作长度

我们发现strcpy是将一个字符串全部拷贝到另一个字符串,strcat是将一个字符串全部追加到另一个字符串后面,strcmp也是比较两个字符串的全部内容,这类操作函数称为长度不受限制的字符串操作函数。 那么我们如果操作字符串时并不想操作整个字符串,而只想操作字符串的一部分怎么办呢? 库函数中的strncpy、strncat、strncmp便解决了这个问题。

1.strncpy

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

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

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

举个例子:

#include#includeint 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.strncat

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

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

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

举个例子:

#include#includeint 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.strncmp

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

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

举个例子:

#include#includeint 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值,所以返回一个负值。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:用函数递归的方法解决汉诺塔问题
下一篇:字符串函数中的求长度、查找、分割和错误报告函数(strlen,strstr,strtok,strerror)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~