当前位置:网站首页>【字符串函数内功修炼】strcpy + strcat + strcmp(一)
【字符串函数内功修炼】strcpy + strcat + strcmp(一)
2022-08-04 22:41:00 【Albert Edison】


前言
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,而 \0 的 ASCII 码值是 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 类型。
比较规定:
- 第一个字符串大于第二个字符串,则返回大于 0 的数字;
- 第一个字符串等于第二个字符串,则返回 0;
- 第一个字符串小于第二个字符串,则返回小于 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;
}
运行结果
边栏推荐
- 【2020】【论文笔记】超表面:多功能和可编程——
- 逆序对的数量
- FinClip崁入式搭建生态平台,降低合作门槛
- 【TCP/IP 四 IP 网际协议】
- Based on the results of the facts
- 【2020】【Paper Notes】Metasurfaces: Multifunctional and Programmable——
- rk3399-9.0 first-level and second-level dormancy
- 【3D建模制作技巧分享】ZBrush如何重新拓扑
- If you can't get your heart, use "distributed lock" to lock your people
- 软测人面试 ,HR 会问到哪些问题?学会涨薪3000+
猜你喜欢

地面高度检测/平面提取与检测(Fast Plane Extraction in Organized Point Clouds Using Agglomerative Hierarchical Clu)

直播带货为农产品开拓销售渠道

老叶的三束玫瑰

【3D建模制作技巧分享】ZBrush如何设置笔刷快捷键

3D激光SLAM:LeGO-LOAM---两步优化的帧间里程计及代码分析

Latex fast insert author ORCID

从“草原牛”到“数字牛”:蒙牛的数字化转型之道

第二讲 软件生命周期

Use ngrok to optimize web pages on raspberry pi (1)

Oracle增加表空间解决ORACLE ORA-01653: unable to extend table报错
随机推荐
阿里巴巴2022届秋招面试真题和答案!
期货开户哪个平台好,要正规安全的
【组成原理 六 存储器类型】
【项目实战】仿照Room实现简单管理系统
Reconfigure the ffmpeg plugin in chrome
特征工程资料汇总
Redis理解
Latex fast insert author ORCID
promise详解
【论文笔记KDD2021】MixGCF: An Improved Training Method for Graph Neural Network-based Recommender Systems
【2020】【论文笔记】超表面:多功能和可编程——
重新配置chrome中ffmpeg插件
shell选择结构(if)
synchronized和ReentrantLock都很丝滑,因为他们都是可重入锁,一个线程多次拿锁也不会死锁,我们需要可重入
质量管理大师爱德华·戴明博士经典的质量管理14条原则
Using ngrok to optimize web pages on raspberry pi (2)
【3D建模制作技巧分享】ZBrush如何重新拓扑
SSM整合完整流程讲解
To Offer | 03. Repeat Numbers in the array
postman接口测试








