🐊专栏订阅:字符串函数
🐈博主主页:翻斗花园第一代码手牛爷爷
目录
- 🐳前言
- 🐸函数介绍
- 🍓[strlen函数](https://legacy.cplusplus.com/reference/cstring/strlen/?kw=strlen)
- 🐉[strcpy函数](https://legacy.cplusplus.com/reference/cstring/strcpy/?kw=strcpy)
- 🌾[strcat函数](https://legacy.cplusplus.com/reference/cstring/strcat/?kw=strcat)
- 🐎[strcmp函数](https://legacy.cplusplus.com/reference/cstring/strcmp/?kw=strcmp)
- 📞总结
🐳前言
我们在c语言的学习中,对字符串的处理很是频繁,但c语言本身是没有字符串类型的,所以字符串通常是放在字符串常量和字符数组中,而字符串常量适用于那些对它不做修改的字符串函数。我们在编写代码的过程中,大多数情况都需要对字符串进行处理,如果我们能有效的运用一些字符串函数来帮助我们对字符串进行处理,无疑这样会事半功倍,下面我们就来介绍一些常用的字符串函数。
🐸函数介绍
🍓strlen函数
size_t strlen ( const char * str );
统计字符串长度函数
- 字符串以
\0
为结束标志,strlen函数是统计\0
之前的字符个数。(不包含\0
) - 参数指向的字符串必须以
\0
结束。 - 函数的返回值为
siez_t
类型,是无符号的(易错点)
🐯strlen函数使用
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = "abcdefg";
printf("%d\n", strlen(arr));
return 0;
}
运行结果如图
arr数组在初始化时字符串的结尾自动添加
\0
如果字符串中包含有\0
的话,那么strlen函数还是返回\0
之前的字符个数。
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = "abcd\0efg";
printf("%d\n", strlen(arr));
return 0;
}
运行结果如图
如果字符数组中没有\0
结束标志的话,那么运行的结果将会是不确定值。
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = { 'a', 'b', 'c'};
printf("%d\n", strlen(arr));
return 0;
}
运行结果如图
另外还有一种容易出错的情况,strlen函数的返回值是size_t
类型,是无符号的。例如下面的代码,
int main()
{
if (strlen("abc") - strlen("abcde") > 0)
{
printf(">\n");
}
else
{
printf("<\n");
}
return 0;
}
如果我们不注意的话,很容易就掉进坑中,认为输出的结果是<
号。但是我们如果仔细思考一下的话会发现,strlen函数返回无符号数,当无符号数减去一个无符号数的时候,结果还是一个无符号数,所以结果为>
号。运行结果如下图:
🐷strlen函数模拟实现
#include <stdio.h>
#include <string.h>
#include <assert.h>
#define max_length 100
size_t my_strlen(const char *arr)
{
assert(arr);
int i = 0;
while (arr[i] != '\0')
{
i++;
}
return i;
}
int main()
{
char arr[max_length] = { 0 };
gets(arr);
printf("%d\n", my_strlen(arr));
return 0;
}
🐉strcpy函数
char * strcpy ( char * destination, const char * source );
复制字符串函数
- 源字符串必须以
\0
结束。 - 拷贝时会将源字符串的
\0
一起复制到目标字符串。 - 目标字符串空间必须足够大,确保能够存放下源字符串。
- 目标字符串必须可变。(常量字符串不能进行赋值)
🌵strcpy函数使用
strcpy函数进行字符串复制时,遇到\0
就停止,并且会把源字符串的\0
一起拷贝过去。如下代码:
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = "**********";
char arr2[] = "hello";
strcpy(arr, arr2);
printf("%s\n", arr);
return 0;
}
运行结果如图:
当源字符串没有\0
时,运行的结果将会是不可知的。如下代码:
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = "**********";
char arr2[] = {'a', 'b', 'c'};
strcpy(arr, arr2);
printf("%s\n", arr);
return 0;
}
运行结果如下图。
目标字符串必须是可变的,当源字符串为常量字符串时,我们知道常量字符串是不可以对其进行赋值的,如下代码。
#include <stdio.h>
#include <string.h>
int main()
{
char* p = "***********";
char arr2[] = "abc";
strcpy(p, arr2);
printf("%s\n", p);
return 0;
}
运行结果如图。
🌱strcpy函数模拟实现
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strcpy(char* arr, const char* arr2)
{
assert(arr);
assert(arr2);
char* p1 = arr;
char* p2 = arr2;
while (*p2 != '\0')
{
*p1++ = *p2++;
}
*p1 = '\0';
return arr;
}
int main()
{
char arr[100] = "************";
char arr2[] = "abcd";
printf("%s\n", my_strcpy(arr, arr2));
return 0;
}
🌾strcat函数
char * strcat ( char * destination, const char * source );
字符串追加函数
- 源字符串必须以
\0
结尾。 - 目标空间必须足够大,能够存放源字符串内容。
- 目标空间必须可以修改。
🌐strcat函数使用
strcat函数给目标字符串追加时,是从目标字符串的末尾\0
处开始追加,并且源字符串的\0
也追加过去。如下代码:
int main()
{
char arr[100] = "hello \0************";
char arr2[] = "abcd";
strcat(arr, arr2);
printf("%s\n", arr);
return 0;
}
运行结果如图:
🔕strcat函数模拟实现
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strcat(char* arr, const char* arr2)
{
assert(arr);
assert(arr2);
char* p = arr;
while (*p != '\0')
{
p++;
}
char* q = arr2;
while (*q != '\0')
{
*p++ = *q++;
}
*p = '\0';
return arr;
}
int main()
{
char arr[100] = "hello \0************";
char arr2[] = "abc";
printf("%s\n", my_strcat(arr, arr2));
return 0;
}
🐎strcmp函数
nt strcmp ( const char * str1, const char * str2 );
字符串比较函数
- strcmp函数比较的不是字符串的长度,而是字符的大小。
- 两个字符串都必须以
\0
结尾。 - 当返回值等于0时,表示两字符串相等,大于0时表示str1大于str2,小于0时表示str1小于str2。
🐲strcmp函数使用
strcmp函数在进行两字符串的比较时,将两字符串相应位置的字符进行比较。如下代码:
int main()
{
char arr[100] = "abcd";
char arr2[] = "bc";
if (strcmp(arr, arr2) > 0)
{
printf("arr > arr2\n");
}
else if(strcmp(arr, arr2) < 0)
{
printf("arr < arr2\n");
}
else
{
printf("arr = arr2\n");
}
return 0;
}
运行结果如图所示:
🐊strcmp函数模拟实现
#include <stdio.h>
#include <string.h>
#include <assert.h>
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1 == *str2 && *str1 != '\0')
{
str1++;
str2++;
}
return *str1 - *str2;
}
int main()
{
char arr[100] = "abcd";
char arr2[] = "bcde";
if (my_strcmp(arr, arr2) > 0)
{
printf("arr > arr2\n");
}
else if(my_strcmp(arr, arr2) < 0)
{
printf("arr < arr2\n");
}
else
{
printf("arr = arr2\n");
}
return 0;
}
📞总结
本章介绍了字符串统计函数,字符串拷贝函数,字符串追加函数,字符串比较函数,并且对每个函数的易错点都进行了标注,对每个函数的功能都进行了模拟实现。后面将持续更新字符串函数详解,觉得有帮助的话就一件三连吧。