字符串函数(一):strcpy(拷贝),strcat(追加),strcmp(比较),及strncpy,strncat,strncmp

本文主要是介绍字符串函数(一):strcpy(拷贝),strcat(追加),strcmp(比较),及strncpy,strncat,strncmp,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

字符串函数

  • 一.strcpy(字符串拷贝)
    • 1.函数使用
    • 2.模拟实现
  • 二.strcat(字符串追加)
    • 1.函数使用
    • 2.模拟实现
  • 三.strcmp(字符串比较)
    • 1.函数使用
    • 2.模拟实现
  • 四.strncpy
    • 1.函数使用
    • 2.模拟实现
  • 五.strncat
    • 1.函数使用
    • 2.模拟实现
  • 六.strncat
    • 1.函数使用
    • 2.模拟实现

一.strcpy(字符串拷贝)

1.函数使用

char* strcpy(char* destination, const char* source);
  • strcpy函数用于拷贝字符串,即将一个字符串中的内容拷贝到另一个字符串中(会覆盖原字符串内容)。它的参数是两个指针,第一个指针指向目标字符串的首地址,即要拷贝到什么地方。第二个指针指向来源字符串的首地址,即用什么字符串拷贝。返回值是目标字符串的首地址
#include<stdio.h>
#include<string.h>
int main()
{//char* p = NULL;//p = "zhangsan";//p是指针变量,可以赋值,将z的地址赋值给p//char name[20] = "xxxxxxxxxx";//name = "zhangsan";//err,name数组名是地址,地址是一个常量值,不能被赋值,name已经被固定死了char name1[20] = "xxxxxxxxxx";char str1[] = "zhang\0san";strcpy(name1, str1);printf("%s\n", name1);char name2[20] = "xxxxxxxxxx";char str2[] = { 'b','i','t' };strcpy(name2, str2);printf("%s\n", name2);//char* p = "abcdef";//p指向常量字符串,存放a的地址,常量字符串是不能修改的//char arr[] = "bit";//strcpy(p, arr);//err//char p[] = "abcdef";//将其放入数组中,使其变成变量可以修改//char arr[] = "bit";//strcpy(p, arr);//rightreturn 0;
}

在这里插入图片描述

  • 我们看到会将源字符串末尾的’\0’,一同拷贝到目标字符串,当源字符串末尾没有’\0’的时候,会一直向后查找,直到找到’\0’为止,停止拷贝,并将’\0’拷贝到目标字符串。

总结:

  • 源字符串必须以 ‘\0’ 结束。
  • 会将源字符串中的 ‘\0’ 拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可修改。

2.模拟实现

  • 进入函数体时先定义一个指针变量保存目标空间的起始位置,便于之后返回。然后将源字符串中的字符一一赋值给目标空间,直到遇到源字符串中的’\0’,将’\0’也赋值给目标空间后结束赋值,并返回目标空间的起始位置。
#include<assert.h>
char* my_strcpy(char* destination, const char* source)
{assert(str != NULL);//断言,若str为NULL,报错,头文件assert.h//或者直接assert(destination && source);char* str = destination;//保存目标空间的起始位置while (*source != '\0')//或者直接while (*source){*destination++ = *source++;}*destination = *source;return str;
}
  • 还可以这样更加简洁一些:
#include<assert.h>
char* my_strcpy(char* destination, const char* source)
{assert(str != NULL);//断言,若str为NULL,报错,头文件assert.hchar* str = destination;while (*destination++ = *source++;){;}return str;
}

二.strcat(字符串追加)

1.函数使用

char *strcat( char* destination, const char* Source );
  • strcat函数用于追加字符串,即将一个字符串中的内容追加到另一个字符串中。它的参数是两个指针,第一个指针指向目标字符串的首地址,即要追加到什么地方。第二个指针指向来源字符串的首地址,即用什么字符串追加。返回值是目标字符串的首地址
#include<stdio.h>
#include<string.h>
int main()
{char arr1[20] = "hello ";char arr2[] = "world";strcat(arr1, "world");printf("%s\n", arr2);char arr3[20] = "hello ";char arr4[] = { 'a','b','c','d','e','f' };strcat(arr3, arr4);printf("%s\n", arr3);return 0;
}

在这里插入图片描述

  • 我们看到会将源字符串末尾的’\0’,一同追加到目标字符串,当源字符串末尾没有’\0’的时候,会一直向后查找,直到找到’\0’为止,停止追加,并将’\0’追加到目标字符串。

总结:

  • 源字符串必须以 ‘\0’ 结束。
  • 目标字符串中也得有 \0 ,否则没办法知道追加从哪里开始。
  • 目标空间必须有足够的⼤,能容纳下源字符串的内容。
  • 目标空间必须可修改。
  • 字符串不能自己给自己追加('\0’被覆盖,无终止条件,陷入死循环),这就是源字符串不能被修改的原因。

2.模拟实现

  • 进入函数体依然先定义一个指针变量用于存放目标空间的起始位置,便于之后返回。然后用循环先找到目标空间的’\0’,之后从’\0’的位置开始追加源字符串的内容,直到追加到源字符串中的’\0’为止。最后返回目标空间的起始位置。
#include<assert.h>
char* my_strcat(char* destination, const char* source)
{assert(destination && source);//断言,若str为NULL,报错,头文件assert.hchar* str = destination;//保存目标空间的起始位置//找到'\0'的位置while (*destination != '\0'){destination++;}//开始追加字符串while (*source != '\0'){*destination++ = *source++;}//添加'\0'*destination = *source;return str;
}
  • 还可以这样更加简洁一些:
#include<assert.h>
char* my_strcat(char* destination, const char* source)
{assert(destination && source);char* str = destination;while (*destination != '\0'){destination++;}while (*destination++ = *source++){;}return str;
}

三.strcmp(字符串比较)

1.函数使用

int strcmp(const char* str1,const char* str2)
  • strcmp函数用于比较两个字符串内容的函数。它的参数是两个指针,指针分别指向两个待比较字符串的首地址。它的返回值是一个整型数字。
  • 依次比较的是对应字符的ASCII值。
  • 当str1 > str2的时候返回正数。
  • 当str1 == str2的时候返回0。
  • 当str1 < str2的时候返回负数。
//错误的写法
#include<stdio.h>
int main()
{char arr1[] = "zhangsan";char arr2[] = "zhangsan";if (arr1 == arr2)printf("==\n");elseprintf("!=\n");//输出!=return 0;
}
  • 我们比较数组也许会像上面这样写,但是数组名是首元素的地址,实际上比较的是两个地址,这两个数组内容虽然一样,但它们是在栈区开辟的两个不同的空间,地址是不一样的,所以无论如何都打印不出==。
//正确的比较方法
#include<stdio.h>
#include<string.h>
int main()
{char arr1[] = "zhangsan";char arr2[] = "zhangsan";int ret = strcmp(arr1, arr2);if (ret < 0)printf("<\n");else if (ret == 0)printf("==\n");//输出==elseprintf(">\n");return 0;
}

总结:

  • 第⼀个字符串大于第⼆个字符串,则返回大于0的数字。
  • 第⼀个字符串等于第⼆个字符串,则返回0。
  • 第⼀个字符串小于第⼆个字符串,则返回⼩于0的数字。
  • 那么如何判断两个字符串? 比较两个字符串中对应位置上字符ASCII码值的大小。

2.模拟实现

  • 进入函数体直接比较起始位置的字符的大小。如果相同并且不为’\0’那么继续比较下一对字符的大小;如果相同并且为’\0’那么说明字符串比较完毕,那么直接返回0;如果不同则直接返回str1与str2中对应字符的ASCII值的差值(当str1中对应字符大于str2中的对应字符时返回正值,当str1中对应字符小于str2中的对应字符时返回负值)。
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);//断言,若str为NULL,报错,头文件assert.hwhile (*str1 == *str2){//遇到都为'\0'的时候,说明字符串相等返回0if (*str1 == '\0')return 0;str1++;str2++;}return (*str1 - *str2);
}

以上三种字符串函数都是长度不受限制的字符串,直到’\0’为止,那有没有长度受限制的字符串函数呢?答案是有的,以下一一为您介绍。

四.strncpy

1.函数使用

char* strncpy (char* destination, const char* source, size_t num);

strncpy的参数与strcpy相比较多出了一个参数,而这个参数就是被拷贝的字符的个数。

注意:

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

例如:

#include<stdio.h>
#include<string.h>
int main()
{char arr1[20] = "xxxxxxxxxx";char arr2[20] = "xxxxxxxxxx";char arr3[] = "aaaaa";strncpy(arr1, arr3, 3);strncpy(arr2, arr3, 7);printf("%s\n", arr1);printf("%s\n", arr2);return 0;
}

arr1:“aaaxxxxxxx…”,arr2:“aaaaa\0\0xxx…”。(…表示还有10个\0)。
在这里插入图片描述

2.模拟实现

char* my_strncpy(char* destination, const char* source, size_t num)
{assert(destination && source);char* ret = destination;while (*source != '\0' && num)//找到\0停止,或num==0停止{*destination++ = *source++;num--;}while (num)//若num!=0,在后面补\0,直到num==0{*destination++ = '\0';num--;}return ret;
}

五.strncat

1.函数使用

char* strncat (char* destination, const char* source, size_t num);

strncat的参数与strcat相比较多出了一个参数,而这个参数就是被追加的字符的个数。

注意:

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

例如:

#include<stdio.h>
#include<string.h>
int main()
{char arr1[20] = "xxxxx\0xxxx";char arr2[20] = "xxxxx\0xxxx";char arr3[] = "aaa";strncat(arr1, arr3, 2);strncat(arr2, arr3, 5);printf("%s\n", arr1);printf("%s\n", arr2);return 0;
}

在这里插入图片描述
arr1:“xxxxxaa\0xx…”,arr2:“xxxxxaaa\0x…”。(…表示还有10个\0)。

2.模拟实现

char* my_strncat(char* destination, const char* source, size_t num)
{assert(destination && source);char* ret = destination;while (*destination != '\0')//找到\0停止{destination++;}while (*source!='\0' && num)//追加字符的两个条件{*destination++ = *source++;num--;}*destination = '\0';//在最后补上\0return ret;
}

六.strncat

1.函数使用

int strncmp ( const char * str1, const char * str2, size_t num );

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

例如:

#include<stdio.h>
#include<string.h>
int main()
{char arr1[] = "abcdef";char arr2[] = "abc";int ret1 = strncmp(arr1, arr2, 3);int ret2 = strncmp(arr1, arr2, 4);return 0;
}
  • 当num为3时,我们比较了arr1和arr2的前3个字符,而它们前3个字符都相同,所以返回的是0;
  • 当num为4时,我们比较了arr1和arr2的前4个字符,因为字符’d’的ASCII值大于字符’\0’的ASCII值,所以返回一个正值。

2.模拟实现

int my_strncmp(const char* str1, const char* str2, size_t num)
{assert(str1 && str2);while (*str1 == *str2 && num)//保证比较前num个字符{if (*str1 == '\0')return 0;str1++;str2++;num--;}return *str1 - *str2;
}

字符串函数(一)到这就结束了,还有字符串函数(二)哦!!!!
创作不易,如果能帮到你的话能赏个三连吗?感谢啦!!!
在这里插入图片描述

这篇关于字符串函数(一):strcpy(拷贝),strcat(追加),strcmp(比较),及strncpy,strncat,strncmp的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/987141

相关文章

MySQL 字符串截取函数及用法详解

《MySQL字符串截取函数及用法详解》在MySQL中,字符串截取是常见的操作,主要用于从字符串中提取特定部分,MySQL提供了多种函数来实现这一功能,包括LEFT()、RIGHT()、SUBST... 目录mysql 字符串截取函数详解RIGHT(str, length):从右侧截取指定长度的字符SUBST

Python将字符串转换为小写字母的几种常用方法

《Python将字符串转换为小写字母的几种常用方法》:本文主要介绍Python中将字符串大写字母转小写的四种方法:lower()方法简洁高效,手动ASCII转换灵活可控,str.translate... 目录一、使用内置方法 lower()(最简单)二、手动遍历 + ASCII 码转换三、使用 str.tr

Java如何用乘号来重复字符串的功能

《Java如何用乘号来重复字符串的功能》:本文主要介绍Java使用乘号来重复字符串的功能,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java乘号来重复字符串的功能1、利用循环2、使用StringBuilder3、采用 Java 11 引入的String.rep

Java实现按字节长度截取字符串

《Java实现按字节长度截取字符串》在Java中,由于字符串可能包含多字节字符,直接按字节长度截取可能会导致乱码或截取不准确的问题,下面我们就来看看几种按字节长度截取字符串的方法吧... 目录方法一:使用String的getBytes方法方法二:指定字符编码处理方法三:更精确的字符编码处理使用示例注意事项方

Kotlin运算符重载函数及作用场景

《Kotlin运算符重载函数及作用场景》在Kotlin里,运算符重载函数允许为自定义类型重新定义现有的运算符(如+-…)行为,从而让自定义类型能像内置类型那样使用运算符,本文给大家介绍Kotlin运算... 目录基本语法作用场景类对象数据类型接口注意事项在 Kotlin 里,运算符重载函数允许为自定义类型重

Pandas中统计汇总可视化函数plot()的使用

《Pandas中统计汇总可视化函数plot()的使用》Pandas提供了许多强大的数据处理和分析功能,其中plot()函数就是其可视化功能的一个重要组成部分,本文主要介绍了Pandas中统计汇总可视化... 目录一、plot()函数简介二、plot()函数的基本用法三、plot()函数的参数详解四、使用pl

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Java中字符串转时间与时间转字符串的操作详解

《Java中字符串转时间与时间转字符串的操作详解》Java的java.time包提供了强大的日期和时间处理功能,通过DateTimeFormatter可以轻松地在日期时间对象和字符串之间进行转换,下面... 目录一、字符串转时间(一)使用预定义格式(二)自定义格式二、时间转字符串(一)使用预定义格式(二)自

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中