一、strlen函数的使用和模拟实现
二、strcpy函数的使用和模拟实现
三、strncpy函数的使用和模拟实现
四、strcat函数的使用和模拟实现
五、strncat函数的使用和模拟实现
六、strcmp函数的使用和模拟实现
七、strncmp函数的使用和模拟实现
八、strstr函数的使用和模拟实现
前言
以下字符串函数基本上都在string.h头文件中,我们经常会遇见求字符串中字符个数、两个字符串进行比较、将某个字符串复制到另一个字符串中等一系列要求。如果我们不知道这些函数,那就要花时间创建,在创建时可能还要想怎么实现这样的功能。而对于已经掌握这些函数的程序员来说,就可以直接引用函数头文件,快速实现字符串的一系列操作。以下几个字符串函数都是在头文件string.h中。
strlen函数的使用和模拟实现
strlen函数被广泛用来求字符串长度,它不将字符串末尾的\0算进字符串长度,()中输入的是字符串的首地址,它从接收的地址开始计数,直到出现第一个所指的对象是‘\0’字符的地址。
接下来就开始模拟strlen函数
1.计数器方式
2.递归方式
错误使用方式:它从字符数组首地址逐渐向后找,若未找到'\0',它就会越界访问继续从s[4]='e'到越界访问s[5],然后报错。
、
strcpy函数的使用和模拟实现
strcpy(),()中有两个参数,列如strcpy(arr,arr1),这里arr和arr1都是字符串的首地址,它将arr1中的字符串复制到arr中,从它们所传递的地址处开始复制,会覆盖arr中最初的字母,当'\0'被赋给*s1时,就完成了循环。
#include<stdio.h>
void str_cpy(char* s1, char* s)
{
while (*s1++ = *s++);
}
int main()
{
char s[20] = "abcdef";
char s1[20] = { 0 };
str_cpy(s1, s);
printf("%s\n", s1);
return 0;
}
strncpy函数的使用和模拟实现
strncpy函数可以实现n个连续字符的复制
#include<stdio.h>
void str_ncpy(char* s, char* s1, int n) //strncpy(s,s1,n)的参数为图所示
{
while (n--)
{
*s++ = *s1++;
}
}
int main()
{
char s[10] = "okdefgh";
char s1[10] = "abcdef";
int n = 0;
scanf("%d", &n);
str_ncpy(s, s1, n);
printf("%s\n", s);
return 0;
}
strcat函数的使用和模拟实现
strcat函数是将两个字符串连接起来,实质上是将一个字符串复制到另一个字符串的末尾处(会将‘\0’覆盖)。注意的是,变长的字符串数组要注意空间大小,否则很容易溢出。
#include<stdio.h>
void str_cat(char* s, char* s1)
{
while (*s != '\0')
{
s++;
}
while (*s = *s1)
{
s++;
s1++;
}
}
int main()
{
char s[20] = "abcdef";
char s1[20] = "ghikj";
str_cat(s, s1);
printf("%s\n", s);
return 0;
}
都看到这了,各位小伙伴们思考一下:如果它连接自己会发生什么呢?(文章结尾处有答案)
strncat函数的使用和模拟实现
strncat函数多了参数n,它是将s1字符串n个连续的字符连接到s的末尾处(会将'\0'覆盖)。
#include<stdio.h>
void str_ncat(char* s, char* s1, int n) //strncat的函数模拟实现就是如此
{
while (*s)
{
s++;
}
while (n--)
{
*s++ = *s1++;
}
}
int main()
{
char s[20] = "abcdefgh";
char s1[20] = "ijklmn";
int n = 0;
scanf("%d", &n);
str_ncat(s, s1, n);
printf("%s\n", s);
return 0;
}
strcmp函数的使用和模拟实现
strcmp函数是将两个字符进行比较
#include<stdio.h>
int str_cmp(const char* a, const char* b)
{
return *a - *b;
}
int main()
{
char a = 'a';
char b = 'b';
int ret=str_cmp(&a, &b);
if (ret)
printf("a的值大于b\n");
else
printf("a的值小于b\n");
return 0;
}
strcmp函数的使用和模拟实现
同理,strncmp是将n个连续的字符进行比较。若两个字符串前面n个字符都相等,它的返回值就为零,判为相等,否则就是不相等了
#include<stdio.h>
int str_ncmp(char* c, char* c1, int n)
{
while ((*c == *c1) && n--)
{
c++;
c1++;
}
return *c - *c1;
}
int main()
{
char c[10] = "abcdefgh";
char c1[10] = "abcdffgh";
int n = 0;
scanf("%d", &n);
int ret = str_ncmp(c, c1, n);
if (ret > 0)
printf("c>c1\n");
else if (ret < 0)
printf("c<c1\n");
else
printf("c==c1\n");
return 0;
}
strstr函数的使用和模拟实现
strstr函数的功能:在某字符串中是否有要被查找的字符串。如果有,则返回目标字符串的地址,否则,返回空指针。
#include<stdio.h>
char* str_str( char* arr, char* read)
{
char* a1 = arr;
char* r1 = read;
if (!*read) //确保要查找的字符串不为空
return NULL;
while (*arr!='\0')
{
a1 = arr; //确保arr的指向不变,用a1进行判断,再通过该表达式使a1回到arr所指向的指针
r1 = read; //该表达式作用也是如此
while (*a1 == *r1)
{
a1++; //若有相同的字符,则继续找下一个。
r1++;
}
if (*r1 == '\0')
return arr;
arr++;
}
return NULL; //找不到,则返回空指针
}
int main()
{
char arr[] = "abcdefghijkl";
char read[] = "def";
char* search=str_str(arr, read);
printf("%s\n", search);
return 0;
}
strcat函数如果连接自己,就会使末尾的‘\0’被改变,从而一直连接,直到字符数组溢出。
各位亲们!看到这了,就给咱一个小红心咯,鼓励鼓励作者吧,离出数据结构和算法已经不远了,后面还会出扫雷以及贪吃蛇游戏,kmp算法不知各位亲们了解吗。关注我,带各位亲们学习更多好玩好用的知识。以后一两期,我会出有关strlen函数与sizeof操作符的比较,还有指针的讲述耶,这两样可不是各位亲们想象的那么简单嘞。除非你已经熟练掌握了c语言。