✨✨小新课堂开课了,欢迎欢迎~✨✨
🎈🎈养成好习惯,先赞后看哦~🎈🎈
所属专栏:http://t.csdnimg.cn/Oytke
小新的主页:编程版小新-CSDN博客
接着字符函数,小新又开始了新的课程教学,就和小新一起来学习字符串函数吧。
1.strlen函数的使用和模拟实现
size_t strlen(conest char * str)
注意:strlen是用来计算字符串长度的,即计算'\0'之前字符的个数
参数指向的字符串必须要包含'\0'
返回类型是size_t,无符号整型
使用时要包含头文件<string.h>
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
conest char str1[] = "labixiaoxin";
conest char str2[] = "xiaokui";
if (strlen(str1) - strlen(str2) > 0)
{
printf("str1>str2\n");
}
else if (strlen(str1) - strlen(str2) < 0)
{
printf("str1<str2\n");
}
else
{
printf("str1=str2");
}
return 0;
}
模拟实现1:模拟实现计数器
#include<stdio.h>
#include<string.h>
#include<assert.h>
int my_strlen(const char* str)
{
assert(str);
int count = 0;
while (*str)
{
count++;
str++;
}
return count;
}
//模拟实现计数器
int main()
{
char str[] = "xiaokui";
int ret = my_strlen(str);
printf("%d\n", ret);
return 0;
}
模拟实现2: 不能创建临时变量的计数器(递归)
#include<stdio.h>
#include<string.h>
#include<assert.h>
//不能创建临时变量的计数器
int my_strlen(const char* str)
{
assert(str);
if (*str == '\0')
return 0;
else
return 1 + my_strlen(str+1);
}
int main()
{
char str[] = "xiaokui";
int ret = my_strlen(str);
printf("%d\n", ret);
return 0;
}
模拟实现3:指针-指针
指针-指针 绝对值 两地址之间元素的个数
#include<stdio.h>
#include<assert.h>
//指针-指针
int my_strlen(const char* str)
{
assert(str);
char* p = str;
while (*str)
{
str++;
}
return str - p;
}
int main()
{
char str[] = "xiaokui";
int ret = my_strlen(str);
printf("%d\n", ret);
return 0;
}
2.strcpy函数的使用和模拟实现
char* strcpy(char* destination, conest char* source)
字面意思就是把source拷贝到destination中去,这个字符串函数的功能就是拷贝字符串,也可以理解为字符串的覆盖,用source中的字符串去把原本destination中的字符串覆盖,下面小新带着大家看代码。
注意:源字符串中必须要有'\0'
strcpy会到源字符串中的'\0'拷贝到目标空间中
要包含头文件<string.h>
目标空间必须足够大,并且目标空间必须可修改
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
char str1[20] = { 0 };
const char str2[] = "labixiaoxin";
strcpy(str1, str2);
printf("%s", str1);
return 0;
}
下面看strcpy的模拟实现:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strcpy(char* str1, const char* str2)
{
char* p = str1;
assert(str1 != NULL);
assert(str2 != NULL);
//拷贝'\0'之前的内容
while (*str1++ = *str2++)
{
;
}
*str1 = *str2;//拷贝'\0'
return p;
}
int main()
{
char str1[20] = { 0 };
const char str2[] = "labixiaoxin";
my_strcpy(str1, str2);
printf("%s", str1);
return 0;
}
3.strcat函数的使用和模拟实现
char * strcat ( char * destination, const char * source )
strcat函数是用来拼接字符串的,也就是把一个字符串放入另一个字符串的后面
注意:源字符串必须以'\0'结尾
目标空间也要包含'\0',以方便追加'\0\,把源字符串拼接过去
目标空间要足够大,能够放进源字符串
要求目标空间可以修改
要包含头文件<string.h>
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<assert.h>
int main()
{
char str1[30] = "labixiaoxin";
const char str2[] = "xihuanxiaobai";
strcat(str1, str2);
printf("%s\n", str1);//labixiaoxinxihuanxiaobai
return 0;
}
小新:下面请看模拟实现
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strcat(char* str1, const char* str2)
{
assert(str1 != NULL);
assert(str2 != NULL);
char* p = str1;
while (*str1)
{
str1++;
}
while (*str1++ = *str2++)
{
;
}
return p;
}
int main()
{
char str1[30] = "labixiaoxin";
const char str2[] = "xihuanxiaobai";
my_strcat(str1, str2);
printf("%s\n", str1);
}
4.strcmp函数的使用和模拟实现
int strcmp ( const char * str1, const char * str2 );
可知strcmp返回的是整型,我们该怎么知道str1和str2的大小呢,答案是看strcmp返回值的大小。
Return Value
Returns an integral value indicating the relationship between the strings:
return value | indicates |
---|---|
<0 | the first character that does not match has a lower value in ptr1 than in ptr2 |
0 | the contents of both strings are equal |
>0 | the first character that does not match has a greater value in ptr1 than in ptr2 |
str1>str2:返回一个大于0 的整数
str1<str2:返回一个小于0的整数
str1==str2:返回0
那么如何判断两个字符串? ⽐较两个字符串中对应位置上字符ASCII码值的⼤⼩。
两个字符串的比较是一个一个比较的,遇到相同的字符时继续向下比较('\0'除外),直到遇到不同的字符时,比较两个字符所对应的ASCII码值的大小,字符大的对应的字符串就大,这个和字符串的长度没啥太大的关系。如果是"abcd"和"abcdef"比较,那这就和字符串的长度有关系了。
下面小新用代码给大家举例
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<assert.h>
int main()
{
const char* str1 = "abcde";
const char *str2 = "abcdf";
int ret1 = strcmp(str1, str2);
printf("%d\n", ret1);//-1
const char* str3 = "abc";
const char* str4 = "abc";
int ret2 = strcmp(str3, str4);
printf("%d\n", ret2);//0
const char* str5 = "abcdrfgh";
const char* str6 = "b";
int ret3 = strcmp(str5, str6);
printf("%d\n", ret3);//-1
return 0;
}
小新:模拟实现如下
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 != NULL);
assert(str2 != NULL);
while (*str1 == *str2)//注意
{
if (*str1 == '\0')//*str1=='\0'说明*str2也是'\0'
return 0;
str1++;
str2++;
}
return *str1 - *str2;
}
int main()
{
const char* str1 = "abcde";
const char *str2 = "abcdf";
int ret1 = my_strcmp(str1, str2);
printf("%d\n", ret1);//-1
return 0;
}
上面的2,3,4是和下面要介绍的函数是差不多的,就是多了一个参数,用法很相似。
5.strncpy函数的使用
char * strncpy ( char * destination, const char * source, size_t num );
num决定的就是你要拷贝的个数,就是多传了一个决定个数的参数。
拷⻉num个字符从源字符串到⽬标空间。如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
char str1[20] = { 0 };
const char str2[] = "labixiaoxin";
strncpy(str1, str2,4);
printf("%s", str1);//labi
return 0;
}
6.strncat函数的使用
char * strncat ( char * destination, const char * source, size_t num );
将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0 字 符
如果source指向的字符串的⻓度⼩于num的时候,只会将字符串中到 \0 的内容追加到destination指向的字符串末尾,即有多少追加多少。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
char str1[30] = "labixiaoxin";
const char str2[] = "xihuanxiaobai";
strncat(str1, str2,5);
printf("%s\n", str1);//labixiaoxinxihuan
return 0;
}
7.strncmp函数的使用
int strncmp ( const char * str1, const char * str2, size_t num );
⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀ 样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
const char* str1 = "abcde";
const char* str2 = "abcdf";
int ret1 = strncmp(str1, str2,4);
printf("%d\n", ret1);//0
const char* str3 = "abc";
const char* str4 = "abc";
int ret2 = strncmp(str3, str4,1);
printf("%d\n", ret2);//0
const char* str5 = "abcdrfgh";
const char* str6 = "b";
int ret3 = strncmp(str5, str6,2);
printf("%d\n", ret3);//-1
return 0;
}
还剩下四个字符串函数放到下次说,今天就先消化这么多吧,剩下的两个要比前面的难一些,但是跟着小新准没错,下次见~