写点什么

【字符串函数内功修炼】strcpy + strcat + strcmp(一)

作者:Albert Edison
  • 2022 年 9 月 18 日
    四川
  • 本文字数:2258 字

    阅读完需:约 7 分钟

【字符串函数内功修炼】strcpy + strcat + strcmp(一)

🌟 前言

C 语言中对字符和字符串的处理很是频繁,但是 C 语言本身是没有字符串类型的,字符串通常放在 常量字符串 中或者 字符数组 中。 字符串常量 适用于那些对它不做修改的字符串函数; 本篇将重点介绍处理 字符字符串 的库函数的使用和注意事项👇

1. strcpy - 字符串拷贝

🍑 函数介绍

char* strcpy(char* Destination, const char* Source);
复制代码


1、strcpy 是将 Source 字符串 的内容拷贝到 Destination 字符串 中;


2、源字符串必须以 \0 结束;


3、会将源字符串中的 \0 一并拷贝到 目标 空间;


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


5、目标空间必须可变;


📝 代码示例


#include <stdio.h>#include <string.h>
int main(){ char str1[] = "hawkeye"; char str2[20] = "EEEEEEEEEEEEEEEE";
strcpy(str2, str1); printf("%s\n", str2); return 0;}
复制代码


运行结果


可以看到 \0 也是拷贝到 str2 中了

🍑 模拟实现

📝 代码示例


#include <stdio.h>#include <assert.h>
char* my_strcpy(char* dest, const char* src) { char* start = dest; assert(dest && src); while (*src) { *dest = *src; dest++; src++; } *dest = *src; //此时src中还剩下\0,赋值给dest return start;}
int main(){ char str1[] = "hawkeye"; char str2[20] = "EEEEEEEEEEEEEEEE";
my_strcpy(str2, str1); printf("%s\n", str2); return 0;}
复制代码


🌟 运行结果



📝 代码升级


#include <stdio.h>#include <assert.h>
char* my_strcpy(char* dest, const char* src) { char* start = dest; assert(dest && src); while (*dest++ = *src++) { ; } return start;}
int main(){ char str1[] = "hawkeye"; char str2[20] = "EEEEEEEEEEEEEEEE";
my_strcpy(str2, str1); printf("%s\n", str2); return 0;}
复制代码


因为是后置 ++,所以 *src 的内容先放到 *dest 中,然后 dest++src++,就找到了第二个元素的地址...以此类推;


src 指向 \0 时,src 赋值给 dest,此时 while 循环里面整个表达式的结果就是 \0,而 \0ASCII 码值是 0,所以循环就停下来了;


为什么要定义 strat 呢?


因为 strcpy 返回的是 目标字符串 的起始地址,而当 while 循环结束以后,dest 不再是起始地址了;


所以事先保存一份 dest 的起始地址到 strat 中。


🌟 运行结果


2. strcat - 字符串追加

🍑 函数介绍

char* strcat(char* destination, const char* source);
复制代码


1、strcat 是用来 连接接字符串 的,它会将参数 source 字符串复制到参数 dest 所指的字符串尾部。


2、源字符串必须以 \0 结束。


3、会将源字符串中的 \0 拷贝到目标空间。


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


5、目标空间必须可变。


📝 代码示例


#include <stdio.h>#include <string.h>
int main(){ char str1[30] = "hello"; char str2[] = "world"; strcat(str1, str2); printf("%s\n", str1);
return 0;}
复制代码


🌟 运行结果


🍑 模拟实现

📝 代码示例


#include <stdio.h>#include <assert.h>
char* my_strcat(char* dest, const char* src) { char* start = dest; assert(dest && src); //1. 目标空间中的\0 while (*dest) { dest++; } //2. 追加内容到目标空间 while (*dest++ = *src++) { ; } return start;}
int main(){ char str1[30] = "hello"; char str2[] = "world"; my_strcat(str1, str2); printf("%s\n", str1);
return 0;}
复制代码


🌟 运行结果


3. strcmp - 字符串比较

🍑 函数介绍

int strcmp(const char* str1, const char* str2);
复制代码


strcmp 用于对 两组字符串进行比较 的函数,比较的是对应位置上的字符大小,它的返回值是 int 类型。


比较规定:


  1. 第一个字符串大于第二个字符串,则返回大于 0 的数字;

  2. 第一个字符串等于第二个字符串,则返回 0

  3. 第一个字符串小于第二个字符串,则返回小于 0 的数字


📝 代码示例


#include <stdio.h>#include <string.h>
int main(){ char str1[] = "abcdef"; char str2[] = "bbq";
int ret = strcmp(str1, str2);
printf("%d\n", ret); return 0;}
复制代码


🌟 运行结果


🍑 模拟实现

📝 代码示例


#include <stdio.h>#include <assert.h>
int my_strcmp(const char* str1, const char* str2) { assert(str1 && str2); while (*str1 == *str2) { //如果两个字符串相等,把某个字符串的\0,拿去返回 if (*str1 == '\0') { return 0; } str1++; str2++; } if (*str1 > *str2) { return 1; } else { return -1; }}
int main(){ char str1[] = "abz"; char str2[] = "abq";
int ret = my_strcmp(str1, str2);
printf("%d\n", ret); return 0;}
复制代码


🌟 运行结果



📝 代码升级


#include <stdio.h>#include <assert.h>
int my_strcmp(const char* str1, const char* str2) { assert(str1 && str2); while (*str1 == *str2) { //如果两个字符串相等,说明他们都已经走到\0的位置 //然后\0 = \0,进行循环,直接进入if语句 if (*str1 == '\0') { return 0; } str1++; str2++; } return *str1 - *str2;}
int main(){ char str1[] = "abcdef"; char str2[] = "bbq";
int ret = my_strcmp(str1, str2);
if (ret < 0) { printf("str1 < str2"); } else if (ret > 0) { printf("str1 > str2"); } else { printf("str1 == str2"); } return 0;}
复制代码


🌟 运行结果


发布于: 刚刚阅读数: 4
用户头像

Albert Edison

关注

目前在某大厂担任后端开发,欢迎交流🤝 2022.03.08 加入

🏅️平台:InfoQ 签约作者、阿里云 专家博主、CSDN 优质创作者 🛫领域:专注于C语言、数据结构与算法、C++、Linux、MySQL、云原生的研究 ✨成就:2021年CSDN博客新星Top9,算法领域优质创作者,全网累计粉丝4W+

评论

发布
暂无评论
【字符串函数内功修炼】strcpy + strcat + strcmp(一)_C语言_Albert Edison_InfoQ写作社区