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

相关文章

Django中的函数视图和类视图以及路由的定义方式

《Django中的函数视图和类视图以及路由的定义方式》Django视图分函数视图和类视图,前者用函数处理请求,后者继承View类定义方法,路由使用path()、re_path()或url(),通过in... 目录函数视图类视图路由总路由函数视图的路由类视图定义路由总结Django允许接收的请求方法http

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

C语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

详解MySQL中JSON数据类型用法及与传统JSON字符串对比

《详解MySQL中JSON数据类型用法及与传统JSON字符串对比》MySQL从5.7版本开始引入了JSON数据类型,专门用于存储JSON格式的数据,本文将为大家简单介绍一下MySQL中JSON数据类型... 目录前言基本用法jsON数据类型 vs 传统JSON字符串1. 存储方式2. 查询方式对比3. 索引

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本