本篇主要实现strlen、strcpy、strcat、strcmp、strstr
strlen函数
功能:
返回C字符串str的长度。
C字符串的长度由终止空字符来确定:一个C字符串是字符串的开头和终止空字符之间的字符数(不包括终止空字符本身)。
声明:
官方给出函数声明:size_t strlen ( const char * str );
size_t保证了返回值为正数,const保证了不会修改所传字符串
实现:
size_t my_strlen(const char *p)
{
assert(p);
const char* end = p;
while (*end)
{
++end;
}
return end - p;
}
int main()
{
char* p = "qwer";
printf("%d",my_strlen(p));//4
return 0;
}
strcpy函数
功能:
将source指向的C字符串复制到destination指向的数组中,包括终止的空字符(并在该点处停止)。
为避免溢出,由destination指向的数组的大小应足够长,以包含与source相同的C字符串(包括终止空字符),并且在内存中不应与source重叠。
声明:
官方给出函数声明:char * strcpy ( char * destination, const char * source );
返回值是 destination的地址指针,const保证了不会修改原字符串
实现:
char* my_strcpy(char *a, const char *p)
{
assert(a);
assert(p);
char* ret = a;
while (*a++ =*p++){}
return ret;
}
int main()
{
char* p = "qwer";
char s[10];
printf("%s", my_strcpy(s,p));//qwer
return 0;
}
strcat函数
功能:
将源字符串source的副本附加到目标字符串destination后。destination中终止的空字符将被source的第一个字符覆盖,并且在destination中两个字符的串联所形成的新字符串的末尾将包含一个空字符。
目的地和来源不得重叠。
声明:
官方给出函数声明:char * strcat ( char * destination, const char * source );
返回值是 destination的地址指针,const保证了不会修改原字符串
实现:
char* my_strcat(char* str1, const char* str2)
{
assert(str1);
assert(str2);
char* ret = str1;
while (*str1)
{
str1++;
}
while ((*str1 = *str2) != '\0')
{
str1++;
str2++;
}
return ret;
}
int main()
{
char p1[9] = "qwer";
char p2[] = "qwer";
printf("%s", my_strcat(p1, p2));//qwerqwer
return 0;
}
strcmp函数
功能:
比较C字符串str1和C字符串str2。
此函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续以比较下一个,直到字符不同或到达终止的空字符为止。
声明:
官方给出函数声明:int strcmp ( const char * str1, const char * str2 );
const保证了不会修改原字符串
返回一个整数值,指示字符串之间的关系:
返回值 | 表示 |
---|---|
<0 | 第一个不匹配的字符在str1中的值比在str2中的值低 |
0 | 两个字符串的内容相等 |
>0 | 第一个不匹配的字符在str1中的值大于在str2中的值 |
实现:
int my_strcmp(const char* str1, const char* str2)
{
while (*str1 && *str2)
{
if (*str1 > * str2)
{
return 1;
}
else if (*str1 < *str2)
{
return -1;
}
else
{
++str1;
++str2;
}
}
if (*str1 == '\0' && *str2 != '\0')
{
return -1;
}
else if (*str1 != '\0' && *str2 == '\0')
{
return 1;
}
else
{
return 0;
}
}
int main()
{
char* p1 = "wer";
char* p2 = "qwer";
printf("%d\n", my_strcmp(p1, p2));//1
printf("%d\n", my_strcmp(p2, p1));//-1
printf("%d\n", my_strcmp(p2, p2));//0
return 0;
}
strstr函数
功能:
比较C字符串str1和C字符串str2。
此函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续以比较下一个,直到字符不同或到达终止的空字符为止。
声明:
官方给出函数声明:char * strstr ( const char *, const char * );
str1:要扫描的C字符串。
str2: C字符串,包含要匹配的字符序列。
返回值:指向str2中指定的整个字符序列在str1中第一次出现的指针,或者如果str1中不存在该序列,则返回 null指针。
实现:
const char* my_strstr(const char* str1,const char* str2)//str1是原文档str2是要找的字符
{
const char* start = str1;
const char* sup = str2;
while(*start)
{
while (*str1 == *sup && *sup != '\0')
{
str1++;
sup++;
}
if(*sup == '\0')
{
return start;
}
else
{
str1 = start +1;
sup = str2;
start++;
}
}
return NULL;
}
int main()
{
char *p1 = "qwerwt";
char *p2 = "wt";
printf("%s\n",my_strstr(p1,p2));
return 0;
}