在编程的过程中,我们经常要处理字符和字符串,为了方便操作字符和字符串,C语⾔标准库中提供了一系列库函数,接下来我们就学习一下这些函数。
strlen strcpy strcat strcmp strncpy strncat strncmp函数的头文件为<string.h>
1、strlen的使用及模拟实现。
size_t strlen ( char * str )
•字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包
含 '\0' )。
• 参数指向的字符串必须要以 '\0' 结束。
• 注意函数的返回值为size_t,是无符号的( 易错 )
• strlen的使⽤需要包含头文件
1、1 strlen函数的使用如下。#include<stdio.h>
#include<stdio.h>
int main()
{
char arr[] = "hello world";
printf("%d", strlen(arr));
}
1、2 strlen函数的模拟实现
#include<stdio.h>
int my_strlen(char* p)
{
int count=0;
while (*p++ != '\0')
count++;
return count;
}
int main()
{
char arr[] = "hello world";
printf("%d", my_strlen(arr));
}
2、strcpy的使用及模拟实现。
char* strcpy(char * destination, const char * source )
•将源指向的C字符串复制到目标指向的数组中,包括终止空字符(并在该点停止)
• 将源字符串中的 '\0' 拷⻉到目标空间。
• 目标空间必须足够大,以确保能存放源字符串
2、1 strcpy的使用
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
char str1[20] = "abcd";
char str2[] = "hello world";
strcpy(str1,str2 );
printf("%s", str1);
return 0;
}
2、2 strcpy 的模拟。
#include<stdio.h>
char* my_strcpy(char* str1, char* str2)
{
char* p = str1;//str1的地址进入循环会改变,所以将str1原本的地址记录起来
while (*str2 != '\0')//str2指向'\0'跳出循环
{
*str1++ = *str2++;//将str2一一赋值给str1
}
return p;//返回str1的地址
}
int main()
{
char str1[20] = "abcd";
char str2[] = "hello world";
printf("%s", my_strcpy(str1, str2));
return 0;
}
3、strcat的使用及模拟实现。
char* strcat( char* destination,char* source )
• 将源字符串的追加到目标字符串中。destinnation的终止字符被source第一个字符覆盖。
•源字符串必须以 '\0' 结束。
•会将源字符串中的 '\0' 拷贝到⽬标空间。
•目标空间必须足够⼤,以确保能存放源字符串。
3、1 strcat的使用
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
char str1[20] = "hello";
char str2[] = "world";
printf("%s", strcat(str1, str2));
return 0;
}
3、2 strcat的模拟
#include<stdio.h>
char* my_strcat(char* str1, char* str2)
{
char* ret = str1;//同上述函数,记录此时str1的地址
while (*str1 != '\0')//找到str1的终止字符并跳出循环
str1++;
while (*str2 != '\0')
*str1++ = *str2++;
return ret; //输出str1;
}
int main()
{
char str1[20] = "hello";//给定字符数组大小
char str2[] = "world";
printf("%s", my_strcat(str1,str2));
}
4、strcmp的使用及模拟实现。
int strcmp ( char* str1, char* str2)
•将相对应位置字符的ascii值一一比较
•第⼀个字符串⼤于第二个字符串,则返回大于0的数字。
•第⼀个字符串等于第二个字符串,则返回0。
•第⼀个字符串小于第二个字符串,则返回小于0的数字。
4、1 strcmp的使用
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
char str1[] = "abcd";
char str2[] = "abce";
printf("%d",strcmp(str1, str2));//strcmp库函数只会输出数字结果,并不会直接输出大小信息
//若数字为正数,则str1大于str2
//若数字为0,则str1等于str2
//若数字为负数,则str1小于str2
}
4、2 strcmp的模拟
#include<stdio.h>
#include<assert.h>
int my_strcmp(char* str1, char* str2)
{
assert(str1 && str2);//若str1或者str2为空,会弹出警告,增加安全性
while (*str1 == *str2)
{
if (*str1 == '\0')//这里说明str1和str2完全相等
return 0;
str1++;
str2++;
}
return *str1 - *str2;//利用两者ASCII的差值直接得出大小
}
int main()
{
char str1[] = "abcd";
char str2[] = "abc";
printf("%d ",my_strcmp(str1, str2));
}
strncpy strncat strncmp函数与上述函数只有一字之差,作用也大体相似。
n代表了选择性的进行函数操作。
那么下面来学习它们的不同之处吧。
5、strncpy的使用及模拟实现。
char* strncpy (char* destinnation , char* source,size_t num )
•拷贝num个字符从源字符串到⽬标空间。
•如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个(我看了很多小编的strncpy函数是没有补加0的,需要注意)
5、1 strncpy的使用
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
char str1[20] = "abcd";
char str2[] = "hello world";
strncpy(str1, str2, 20);
printf("%s", str1);
return 0;
}
5、2 strncpy的模拟
#include<stdio.h>
char* my_strncpy(char* str1, char* str2,size_t n)
{
char* p = str1;//str1的地址进入循环会改变,所以将str1原本的地址记录起来
int i = n;//记录n原本的值
while(n--&&*str2!='\0')
{
*str1++ = *str2++;//将str2一一赋值给str1
}
if(i>strlen(str2))//需要复制的字符数大于str2字符长度时,用0补充
while (n--)
{
*str1++ = '0';
}
*str1 = '\0';
return p;//返回str1的地址
}
int main()
{
char str1[20] = "abcd";
char str2[] = "hello world";
my_strncpy(str1, str2,20);
printf("%s", str1);
return 0;
}
6、strncat的使用及模拟实现。
char* strncat (char* destinnation , char* source,size_t num )
.将source的n个字节复制到destination后
6、1 strncat的使用
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
char str1[20] = "hello";
char str2[] = "world";
printf("%s", strncat(str1, str2,3));
return 0;
}
6、2 strncat的模拟
#include<stdio.h>
char* my_strcat(char* str1, char* str2,size_t n)
{
char* ret = str1;//同上述函数,记录此时str1的地址
while (*str1 != '\0')//找到str1的终止字符并跳出循环
str1++;
while (*str2 != '\0'&&n--)
*str1++ = *str2++;
return ret; //输出str1;
}
int main()
{
char str1[20] = "hello";//给定字符数组大小
char str2[] = "world";
printf("%s", my_strcat(str1,str2,3));
}
7、strncmp的使用及模拟实现。
int strncat (char* destinnation , char* source,size_t num )
比较str1和str2的前num个字符,如果相等就继续往后比较,最多比较num个字⺟,如果提前发现不一样,就提前结束,大的字符所在的字符串⼤于另外一个。如果num个字符都相等,就是相等返回0
7、1 strncmp的使用
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
char str1[] = "abcde";
char str2[] = "abce";
printf("%d",strncmp(str1, str2, 4));//strcmp库函数只会输出数字结果,并不会直接输出大小信息
//若数字为正数,则str1大于str2
//若数字为0,则str1等于str2
//若数字为负数,则str1小于str2
}
7、2 strncmp的模拟
#include<stdio.h>
#include<assert.h>
int my_strncmp(char* str1, char* str2,size_t n)
{
assert(str1 && str2);//若str1或者str2为空,会弹出警告,增加安全性
while (*str1 == *str2&&--n)//注意这里为--n;
{
if (*str1 == '\0')//这里说明str1和str2完全相等
return 0;
++str1;
++str2;
}
return *str1 - *str2;//利用两者ASCII的差值直接得出大小
}
int main()
{
char str1[] = "abcd";
char str2[] = "abc";
printf("%d ",my_strncmp(str1, str2,4));
}
看到这里,喜欢作品就留下小红心再走吧 ,能得到你们的支持是我创作的不竭动力。
我会力所能及地与你们分享知识,关注我,下篇学习初步数据结构哦