900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > C语言字符串库函数strcpy strncpy strcat strncat ctrcmp strncmp的简介与实现

C语言字符串库函数strcpy strncpy strcat strncat ctrcmp strncmp的简介与实现

时间:2022-07-31 11:24:49

相关推荐

C语言字符串库函数strcpy strncpy strcat strncat ctrcmp strncmp的简介与实现

目录

一、C语言部分字符串库函数的介绍

1.strcpy函数的介绍

2.strncpy函数的介绍

3.strcat函数的介绍

4.strncat函数的介绍

5.strcmp函数的介绍

6.strncmp函数的介绍

7.总结

二、部分字符串库函数的模拟实现

1.strcpy函数的模拟实现

2.strcpy函数的模拟实现

3.strcat函数的模拟实现

4.strncat函数的模拟实现

5.strcmp函数的模拟实现

6.strncmp函数的模拟实现

一、C语言部分字符串库函数的介绍

1.strcpy函数的介绍

(1)函数声明为:char*strcpy(char*strDestination,constchar*strSource);

(2)参数介绍:strDestination为目的地字符串的首元素地址,strSource为源头字符串的首元素地址

(3)返回值介绍:该函数返回值的类型为char*,返回值为目的地字符串的首元素的地址

(4)功能简介:将strSource所指向的字符串复制到strDestination所指向的字符串中(包括\0)。

(5)例子:char arr1[20]="abcdefg";

char arr2[]="hello";

strcpy(arr1,arr2);

则此时arr1[20]为"hello"。

(6)注意事项:1)arr1应为字符数组,不能是常量字符串,即目的字符串的内容要能够被修改。

2)arr1的长度要能够容纳复制进来的字符串。

3)复制时从源头字符串的第一个字符开始向目的字符串复制,直到遇到'\0'时停止, 并会将‘\0’复制

2.strncpy函数的介绍

(1)函数声明为:char*strncpy(char*strDest,constchar*strSource,size_tcount);

(2)参数介绍:strDest为目的地字符串的首地址,strSource为源头字符串的首地址,count为复制 的长度(size_t为无符号整型,因为复制的长度不能为负值)。

(3)返回值介绍:该函数返回值的类型为char*,返回值为目的地字符串的首元素的地址。

(4)功能简介:把str2的n个字符拷贝到str1里

strncpy 的特点:如果要拷贝的长度比源头字符串的长度还要长时,会用\0补全

(5)例子:char arr1[20]="abcdefghij";

char arr2="hello";

strncpy(arr1,arr2,3)执行后,arr1为"heldefghij"

strncpy(arr1,arr2,8)执行后,arr1为"hello\0\0\0ij"

(6)注意事项 :1)arr1应为字符数组,不能是常量字符串,即目的字符串的内容要能够被修改。

2)arr1的长度要能够容纳复制进来的字符串。

3)复制时从源头字符串的第一个字符开始向目的字符串进行复制,直到长度达到count时为止,若长度大于源头字符串的长度时用\0补齐(如上述例子中第二个)。

3.strcat函数的介绍

(1)函数声明:char*strcat(char*strDestination,constchar*strSource);

(2)参数介绍:strDestination为目的地字符串的首元素地址,strSource为源头字符串的首元素地址

(3)返回值介绍:该函数返回值的类型为char*,返回值为目的地字符串的首元素的地址

(4)功能简介:将strSource所指向的字符串连接在strDestination所指向的字符串后面。

(5)例子:char arr1[20]="abcdefg";

char arr2[]="hijklmn";

strcat(arr1,arr2)执行后,arr1[]="abcdefghijklmn"

(6)注意事项:1)arr1应为字符数组,不能是常量字符串,即目的字符串的内容要能够被修改。

2)arr1的长度要能够容纳连接后的字符串。

3)连接时是把strSource所指向的字符串的内容依次连接在strDestination所指向的字 符串后面(连接的起始位置为strDestination指向的字符串中第一个'\0'的位置),直 到遇到'\0'为止(包括字符'\0')。

4)将自己连接在自己后面不能使用该函数,因为在连接的过程中会覆盖字符'\0'而找不到结束的位置

4.strncat函数的介绍

(1)函数声明:char*strncat(char*strDest,constchar*strSource,size_tcount);

(2)参数介绍:strDest为目的地字符串的首地址,strSource为源头字符串的首地址,count为连接 的长度(size_t为无符号整型,因为复制的长度不能为负值)。

(3)返回值介绍:该函数返回值的类型为char*,返回值为目的地字符串的首元素的地址。

(4)功能简介:将源头字符串的count个字符连接在目的字符串后。

(5)例子:char arr1[20]="abcdef\0*********";

char arr2[]="hijk";

若strncat(arr1,arr2,3)执行后,aar1[20]="abcdefhij\0******"

若strncat(arr1,arr2,7)执行后,arr1[20]="abcdefhijk\0*****"

(6)注意事项:1)arr1应为字符数组,不能是常量字符串,即目的字符串的内容要能够被修改。

2)arr1的长度要能够容纳连接后的字符串。

3)连接时是把strSource所指向的字符串的count个字符依次连接在目的字符串即 strDestination所指向的字符串后(起始位置为目的字符串第一个'\0'的位置)。

4)连接时会自动在最后放一个'\0',即若连接字符长度count为2时,实际连接的是3个 字符,第三个字符为'\0',因此自己连接自己时应该使用此函数。但若连接长度恰好 为源头字符串的长度+1时,即末尾连接源字符串中的'\0',此时不会自己再补上一 个'\0'。如:源字符串为"abc",连接长度为4时,将字符串中的4个字符连接后,末尾已有来自于源字符串中的'\0'时,就不会再补一个'\0'了,即实际连接的字符串个 数为4个,分别是'a','b','c','\0'

5)若连接长度count大于源头字符串的长度时,只会将源字符串中的字符连接到目的字符串后(包括'\0'),而不会向strncpy函数那样用字符'\0'补全。

6)上面所说源头字符串的长度均是用strlen函数所得到的长度,即只关心第个'\0'的位置。如源字符串为"abc\0hijk",连接长度为7时,只会连接4个字符。

5.strcmp函数的介绍

(1)函数声明:intstrcmp(constchar*string1,constchar*string2);

(2)参数介绍:string1与string2为要比较的两个字符串。

(3)返回值介绍:返回值的类型是一个有符号整型数据。

(4)功能简介:比较两个字符串的大小,通过字符串对应位置的字符的ASCII值来进行比较,直到确 定两字符串的大小为止。当string1大于string2时,返回一个大于0的数,当string1小 于string2时,返回一个小于0的数字,当string1=string2时,返回0。

(5)例子:char string1[]="abcdef";

char string2[]="abcdefg";

char string3[]="abchijkl";

string1与string2进行比较时,一对一对的字符进行比较:'a'=='a','b'=='b',……'f'=='f',

string1的最后一个字符'\0'的ASCII值为0,小于string2的最后一个字符'g',所以string1小于 string2,当调用函数strcmp(string1,string2)时会返回一个小于0的数字,同理当调用函数 strcmp(string3,string2)时会返回一个大于0的数字,调用函数strcmp(string1,"abcdef")会 返回0。

(6)注意事项:该函数的返回值在vs/vs环境下返回值为-1,0,1,但并不意味着大于时返回 值只能为1,小于时返回值只能为-1。

6.strncmp函数的介绍

(1)函数声明:intstrncmp(constchar*string1,constchar*string2,size_tcount);

(2)参数介绍:string1和string2为要比较的字符串,count是无符号整型数,是要比较的字符的个数

(3)返回值介绍:返回值为有符号整型数据。

(4)功能介绍:此函数除了比较的字符为前count个字符外,其余与strcmp相同。

7.总结

(1)strcpy,strcat,strcmp为长度不受限制的函数,使用strcpy与strcat特别要注意长度,当长度太大在vs/vs环境下函数也能执行,会打印出结果,但是会由于非法访问内存而导致程序崩溃。

(2)strncpy,strncat,strncmp为长度受限制的字符串,其长度均为无符号整型数据。

(3)字符串复制(cpy),连接(cat)函数返回值均为目的字符串首字符的地址,比较(cmp)函数返回值为有符号整型。

(4)自己倍加时(即如str[10]="abc",要使str[10]="abcabc")要使用strncat函数。

二、部分字符串库函数的模拟实现

1.strcpy函数的模拟实现

#include<stdio.h>#include<assert.h>char* my_strcpy(char* str1, const char* str2){//保证接收到的指针不是空指针assert(str1 != NULL);assert(str2 != NULL);char* str = str1;//记录目的字符串的起始位置//把str2指向的内容拷贝到str1中,包括\0while (*str1++=*str2++){;}return str;}

2.strcpy函数的模拟实现

#include<stdio.h>#include<assert.h>char* my_strncpy(char* dest, const char* src, size_t count)//size_t表示无符号整型{assert(dest && src);char* ret = dest;//当count不为0时,且src不为\0时//把src指向的值赋给dest所指向的值,并且src与dest同时--;count也--//直到count=0,或src为\0为止while (count && *src){count--;*dest++ = *src++;}if (count)//如果count不为0,继续拷贝并用\0补全{while (count){*dest++ = '\0';count--;}}return ret;}

3.strcat函数的模拟实现

#include<stdio.h>#include<assert.h>char* my_strcat(char* str1, const char* str2){assert(str1 != NULL);assert(str2 != NULL);char* str = str1;//记录目的字符串的起始位置while (*str1)//寻找目的字符串第一个'\0'字符的位置{str1++;}while (*str1++ = *str2++)//将源字符串的内容复制到目的字符串中{;}return str;}

4.strncat函数的模拟实现

#include<stdio.h>#include<assert.h>char* my_strncat(char* str1, const char* str2, size_t count){assert(str1 && str2);char* ret = str1;//寻找字符串str1中\0的位置,从\0的位置连接字符串 while (*str1){str1++;}//当count不为0并且str2的内容不为\0时//将str2的内容赋值给str1所指向的内容while (count && *str2!='\0'){*str1++ = *str2++;count--;}//str2为\0,或count=0时;将当前str1所指向的内容的值修改为\0*str1 = '\0';return ret;}

5.strcmp函数的模拟实现

#include<stdio.h>#include<assert.h>int my_strcmp(const char* str1, const char* str2){assert(str1 && str2);while (*str1 || *str2)//当str1或str2的内容不是'\0'时{if (*str1 == *str2)//如果当前一组字符相等,向后继续比较{str1++;str2++;}else//若当前两字符不相等{//用str1所指向的字符减去str2所指向的字符,并返回//若str1>str2,返回值大于0,否则返回值小于0return *str1 - *str2;}}//若前几组字符都相等,最后一组字符str1与str2的内容都是'\0',则两字符串相等,返回0return 0;}

6.strncmp函数的模拟实现

#include<stdio.h>#include<assert.h>int my_strncmp(const char* str1, const char* str2, size_t count){assert(str1 && str2);//当count不为0时,依次比较每一组字符while (count--){if (*str1 == *str2)//如果当前一组字符相等,向后继续比较{str1++;str2++;}else//若当前两组字符不相等,比较结束,返回两字符的ASCII码的差值return *str1 - *str2;}//若count==0,说明所比较的字符都相等,返回0return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。