C语言学习NO.12-字符函数(二)-strcpy,strcat,strcmp长度不受限制的字符串函数

本文主要是介绍C语言学习NO.12-字符函数(二)-strcpy,strcat,strcmp长度不受限制的字符串函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、strcpy的使用和模拟实现

(一)strcpy使用

//strcpy的使用
#include <stdio.h>int main()
{char arr1[] = "abcdef";char arr2[10] = "qwertt";char arr3[10] = "okl";strcpy(arr2, arr1);printf("arr2 = %s\n", arr2); strcpy(arr2, arr3);printf("arr1 = %s\narr2 = %s\narr3 = %s", arr1,arr2,arr3);return 0;
}

(二)strcpy使用的注意事项

• 注意strcpy需要包含的头文件是 <string.h>

• 源字符串必须以 '\0' 结束,会将源字符串中的 '\0' 拷贝到目标空间。

• 目标空间必须足够大,以确保能存放源字符串。

• 目标空间必须可修改。

•strcpy函数返回的是目标空间的起始地址

如下例,字符中的'\0'也会同样被赋值进目标空间。

#include <stdio.h>int main()
{char arr1[] = "xxxxxxxxxx";char arr2[] = "abc";strcpy(arr1, arr2);printf("%s", arr1);return 0;
}

当源字符串空间大于目标空间时,使用strcpy函数会有怎样的结果?

系统会报错。

#include <stdio.h>
#include <string.h>
int main()
{char arr1[] = "xxxxxxxxxx";char arr2[] = "abc";strcpy(arr2, arr1);printf("%s", arr2);return 0;
}

(三)strcpy的模拟实现

strcpy函数返回的是目标空间的起始地址

strcpy函数的返回类型的设置是为了实现链式访问

#include <stdio.h>
#include <string.h>
#include <assert.h>char *my_strcpy(char* str1, const char* str2)
{assert(str1 && str2);while (*str2){*str1 = *str2;++str1;++str2;if (*str2 == '\0')*str1 = *str2;}return str1;
}int main()
{char arr1[] = "abcdef";char arr2[] = "qwert";my_strcpy(arr1,arr2);printf("%s", arr1);return 0;
}

进行优化

#include <stdio.h>
#include <string.h>
#include <assert.h>char* my_strcpy(char* str1, const char* str2)
{assert(str1 && str2);while (*str1++ = *str2++){;}return str1;
}int main()
{char arr1[] = "abcdef";char arr2[] = "qwert";my_strcpy(arr1, arr2);printf("%s", arr1);return 0;
}

二、strcat的使用和模拟实现

(一)strcat使用

#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "abcdef";char arr2[] = "poiuy";strcat(arr1, arr2);printf("arr1=%s\narr2=%s", arr1, arr2);return 0;
}

(二)strcat使用的注意事项

  • 注意strcpy需要包含的头文件是 <string.h>
  • 源字符串必须以 '\0' 结束。
  • 目标空间必须有足够的大,能容纳下源字符串的内容。
  • 目标空间必须可修改。

(三)strcat的模拟实现

#include <stdio.h>
#include <assert.h>char* my_strcat(char* dest, char* src)
{assert(dest && src);char* ret = dest;while (*dest)//找目标字符串中的'\0'{dest++;}while (*dest++ = *src++)//附加字符串{;}return ret;
}int main()
{char arr1[20] = "asdfg";char arr2[] = "mnbvc";my_strcat(arr1, arr2);printf("%s", arr1);return 0;
}

(四)字符串自身附加

#include <stdio.h>
#include <assert.h>char* my_strcat(char* dest, char* src)
{assert(dest && src);char* ret = dest;while (*dest)//找目标字符串中的'\0'{dest++;}while (*dest++ = *src++)//附加字符串{;}return ret;
}int main()
{char arr[20] = "asdfg";my_strcat(arr, arr);printf("%s", arr);return 0;
}

存在错误,自身附加自身的字符串时,字符串的'\0'很容易被覆盖。

三、strcmp的使用和模拟实现

(一)strcmp使用

#include <stdio.h>
#include <string.h>
int main(){char arr1[] = "asdfgh";char arr2[] = "ascfgh";char arr3[] = "asdfghj";char arr4[] = "asdfghj";int ret1 = strcmp(arr2, arr1);int ret2 = strcmp(arr3, arr1);int ret3 = strcmp(arr2, arr3);int ret4 = strcmp(arr4, arr3);printf("%d %d %d %d", ret1, ret2, ret3,ret4);return 0;
}

(二)strcmp使用的注意事项

  • 此函数开始比较每个字符串的第一个字符。如果它们彼此相等则继续比较后续的字符相应,直到字符不同或终止达到null字符。
  • 标准规定
    • 第一个字符串大于第二个字符串,则返回大于0的数字
    • 第一个字符串等于第二个字符串,则返回0
    • 第一个字符串小于第二个字符串,则返回小于0的数字

(三)strcmp的模拟实现


#include <stdio.h>
#include <assert.h>int* my_strcmp(char* s1, const char* s2)
{assert(s1 && s2);while (*s1 == *s2){if(*s1 == '\0')return 0;s1++;s2++;}if (*s1 > *s2)return 1;elsereturn -1;
}int main()
{char arr1[] = "asdfgh";char arr2[] = "asdfg";int ret = my_strcmp(arr1, arr2);printf("%d", ret);return 0;
}

这篇关于C语言学习NO.12-字符函数(二)-strcpy,strcat,strcmp长度不受限制的字符串函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/576646

相关文章

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

Go语言中Recover机制的使用

《Go语言中Recover机制的使用》Go语言的recover机制通过defer函数捕获panic,实现异常恢复与程序稳定性,具有一定的参考价值,感兴趣的可以了解一下... 目录引言Recover 的基本概念基本代码示例简单的 Recover 示例嵌套函数中的 Recover项目场景中的应用Web 服务器中

C#如何去掉文件夹或文件名非法字符

《C#如何去掉文件夹或文件名非法字符》:本文主要介绍C#如何去掉文件夹或文件名非法字符的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#去掉文件夹或文件名非法字符net类库提供了非法字符的数组这里还有个小窍门总结C#去掉文件夹或文件名非法字符实现有输入字

使用Python实现base64字符串与图片互转的详细步骤

《使用Python实现base64字符串与图片互转的详细步骤》要将一个Base64编码的字符串转换为图片文件并保存下来,可以使用Python的base64模块来实现,这一过程包括解码Base64字符串... 目录1. 图片编码为 Base64 字符串2. Base64 字符串解码为图片文件3. 示例使用注意

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与