当前位置:网站首页>【字符串函数内功修炼】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;
}
运行结果
边栏推荐
猜你喜欢
随机推荐
shell选择结构(if)
go语言的time包介绍
Ts——项目实战应用enum枚举
2022年全网最全接口自动化测试框架搭建,没有之一
遍历await方法的区别:以for和forEach为例
【3D建模制作技巧分享】ZBrush如何重新拓扑
【3D建模制作技巧分享】ZBrush如何使用Z球
Lecture 2 Software Life Cycle
[Paper Notes KDD2021] MixGCF: An Improved Training Method for Graph Neural Network-based Recommender Systems
go语言的日志实现(打印日志、日志写入文件、日志切割)
【云原生 · Kubernetes】Kubernetes运维
SSM整合完整流程讲解
CS8416国产替代DP8416 数字音频接收器
字节跳动秋招提前批高频面试问题汇总!(内附答案!)
SQL Server 调用 WebService
三个多月、40余场面试浓缩为6000字
边缘检测——(纯享版)
If you can't get your heart, use "distributed lock" to lock your people
Using ngrok to optimize web pages on raspberry pi (2)
历史上的今天:PHP公开发布;iPhone 4 问世;万维网之父诞生