道虽迩,不行不至;事虽小,不为不成。 ——《荀子·修身》
目录
六.strncmp函数,strncpy函数,strncat函数
什么是字符串函数?
字符串函数就是对字符串进行一系列的操作,如求字符串长度,拷贝字符串,字符串尾接,字符串比较等等。一系列的函数,今天我们将把这些函数的实现以及模拟实现进行一一的讲解。希望对你有所帮助。创作不易,希望各位老表能赏点赞吃。
一.strlen函数
1.strlen函数它的功能和注意事项:
strlen函数是求一个字符串函数的长度,求的是'\0'之前出现的字符个数,不包括'\0'。
如果你把字符串数组写成这样:char arr[] = { 'a','b','c' },这里面就没有以'\0'为结尾的结束标志,求出来的就是随机值。
所以我们在初始化字符串时,一定要初始化为以'\0'为结尾的字符串。这样才能使用strlen函数准确的求出字符串长度。
2.实现strlen函数:
#include<stdio.h>
#include<string.h>//字符串函数必须要的头文件
int main()
{
char arr[] = "abcdef";//结尾还有一个\0结尾,数组大小为7
int len = strlen(arr);
printf("%d\n", len);
return 0;
}
3.模拟实现strlen函数
对于模拟实现strlen函数我们使用三种方法:第一种计数器,第二种指针减指针,第三种递归。
第一种:计数器
//计数器,创建一个变量来统计字符的个数
int my_strlen(char* str)
{
assert(str);
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = "Hello";
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
第二种:指针减指针
#include<assert.h>//断言所需要的头文件
int my_strlen(char* str)
{
assert(str);//指针我们一般都会断言一下,更加规范
char* start = str;//指向首位置的指针
while (*str != '\0')
{
str++;
}
return str - start;//末位置减首位置的指针就是字符串的个数
}
int main()
{
char arr[] = "Hello";
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
第三种递归:如果题目说不能创建临时变量,就可以使用递归来实现。
int my_strlen(char* str)
{
assert(str);
if (*str != '\0')
return 1 + my_strlen(str + 1);
else
return 0;
}
int main()
{
char arr[] = "Hello";
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
二.strcpy函数
1.strcpy函数它的功能和注意事项
strcpy函数的功能:将源字符串的内容拷贝到另目标空间的字符串上面去。
注意事项:源字符串必须以'\0'结尾。
会将源字符串中的'\0'也拷贝到目标空间去。
目标空间必须足够大,以确保能存放源字符串。
目标空间必须可变。
strcpy函数的返回值是目标字符串的首地址。
2.实现strcpy函数:
int main()
{
char arr1[] = "abcdef";
char arr2[] = "##########";
strcpy(arr2, arr1);//注意顺序,把arr1的内容拷贝到arr2中
printf("%s\n", arr2);
return 0;
}
3.模拟实现strcpy函数
char* my_strcpy(char* dest, char* str)
{
assert(dest && str);
char* start = dest;
while (*dest = *str)//从起始位置开始拷贝字符串
{
dest++;
str++;
}
return start;
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "##########";
my_strcpy(arr2, arr1);
printf("%s\n", arr2);
return 0;
}
三.strcat函数
1.strcat函数它的功能和注意事项
strcat函数的功能:将源字符串尾接到目的字符串上面。源字符串的首字符把目的字符串的'\0'开始尾接,直到遇到源字符串的'\0',即尾接结束。
举个例子:
注意事项:目标字符串的大小必须足够大,大到能够放下两个数组的大小和。
目标字符串的空间必须可改变。
2.实现strcat函数
int main()
{
char arr1[20] = "Hello ";
char arr2[] = "world";
strcat(arr1, arr2);
printf("%s\n", arr1);
}
3.模拟实现strcat函数
char* my_strcat(char* dest, char* str)
{
assert(dest && str);
char* start = dest;
while (*dest)//把目标字符串遍历完到'\0'
{
dest++;
}
while (*dest = *str)//刚开始dest为'\0',开始尾接
{
dest++;
str++;
}
return start;
}
int main()
{
char arr1[20] = "Hello ";
char arr2[] = "world";
my_strcat(arr1, arr2);
printf("%s\n", arr1);
}
四.strcmp函数
1.strcmp函数它的功能和注意事项
strcmp函数的功能:strcmp中的cmp就是单词compare(比较)的意思。顾名思义strcmp函数就是比较两个字符串,而比较字符串的时候,比较的是字符ACSll值的大小。
两个字符串比较是一个一个字符比较,一个字符串中的字符的ASCll值大于另一个字符串中的字符的ASCll值,如果大于就返回大于1的数字;如果小于就返回小于去的数字;如果相等就返回0。
举个例子:
这里给大家分享一个ASCll表:
返回值:
2.实现strcmp函数
int main()
{
char arr1[] = "abcd";
char arr2[] = "ad";
int ret=strcmp(arr1, arr2);
printf("%d\n", ret);
return 0;
}
3.模拟实现strcmp函数
int my_strcmp(char* str1, char* str2)
{
assert(str1 && str2);
while (*str1 = *str2)//如果两个字符相等,则继续找下一个字符
{
if (*str1 == '\0')//如果比较完了,就返回0
{
return 0;
}
str1++;
str2++;
}
if (*str1 > *str2)
return 1;
else
return -1;
}
int main()
{
char arr1[] = "abcd";
char arr2[] = "ad";
int ret=my_strcmp(arr1, arr2);
printf("%d\n", ret);
return 0;
}
五.strstr函数
1.strstr函数它的功能和注意事项
strstr的功能:strstr (str1,str2) 函数用于判断字符串str2是否是str1的子串。 如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;否则,返回NULL。
功能:strstr返回一个指针,指向string2在string1中首次出现的位置。
举个栗子:
2.实现strstr函数
int main()
{
char arr1[] = "abbbcd";
char arr2[] = "bbc";
char* p = strstr(arr1, arr2);
if (p == NULL)
printf("没找到\n");
else
printf("%s\n", p);
return 0;
}
3.模拟实现strstr函数
正确的方法:
char* my_strstr(char* str1, char* str2)
{
assert(str1 && str2);
char* s1 = NULL;
char* s2 = NULL;
char* temp = str1;
while (*temp)
{
s1 = temp;
s2 = str2;//下一个循环之后,s2始终被赋值为arr2的首地址
while (*s1&&*s2&&*s1 == *s2)//如果不相等或者遇到'\0'就退出循环
{
s1++;
s2++;
}
if (*s2== '\0')//s2是那个找的子字符串,更短,所以这里判断s2
{
return temp;
}
temp++;//每一次使temp指向下一个位置
}
return NULL;
}
int main()
{
char arr1[] = "abbbcd";
char arr2[] = "bbc";
char* p = my_strstr(arr1, arr2);
if (p == NULL)
printf("没找到\n");
else
printf("%s\n", p);
return 0;
}
六.strncmp函数,strncpy函数,strncat函数
这几个函数都是strcmp函数,strcpy函数,strcat函数的变形,也就是在中间加了一个n,这个你的意思就是想要操作几个字符。其实功能和那几个函数是一致的。
它们是不受长度的限制的。
strncpy函数:
int main()
{
char arr1[] = "abcdef";
char arr2[] = "######";
strncpy(arr2, arr1,3);//只拷贝三个字符
printf("%s\n", arr2);
return 0;
}
strncmp函数:
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abd";
//按理说arr2应该大于arr1,但是这里只有两个字符比较,故应相等
int ret=strncmp(arr2, arr1, 2);
printf("%d\n", ret);
return 0;
}
strncat函数 :
int main()
{
char arr1[] = "abcdef";
char arr2[10] = "bit";
strncat(arr2, arr1, 5);
printf("%s\n", arr2);
return 0;
}
全部的内容到这里也就结束了,望各位看官老爷点点赞,谢谢!