字符函数和字符串函数
1.strlen
size_t strlen(const char* str)
-
字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
-
参数指向的字符串必须要以 ‘\0’ 结束。
-
注意函数的返回值为size_t,是无符号的( 易错 ) 。
4.学会strlen函数的模拟实现
#include <stdio.h>
#include <string.h>
int main()
{
const char*str1 = "abcdef";
const char*str2 = "bbb";
if(strlen(str2)-strlen(str1)>0)
{
printf("str2>str1\n");
}
else
{
printf("srt1>str2\n");
}
return 0;
}
那strlen函数该如何模拟实现呢?(指针方式)
#include <stdio.h>
int My_strlen(char*s)
{
char* p=s;
while(*p!='\0')
{
p++;
}
return p-s;
}
2.strcpy
举例说明:
#include <stdio.h>
#include <string.h>
//字符串函数 strcpy
//strcpy(char* dest,char*source)
int main()
{
char arr1[10] = "abcdef";
char arr2[] = "bbb";
strcpy_s(arr1, arr2);
printf("%s\n", arr1);
My_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
那如何进行模拟实现呢??
char* My_strcpy(char* dest, char* source)
{
assert(dest && source);
char* ret = dest;
while (*dest++ = *source++)
{
;
}
return ret;
}
3.strcat和strncat
//strcat-字符连接函数
int main()
{
char arr1[20] = "abc";
char arr2[] = { 'd','e','f','\0' };
printf("%s\n", strcat_s(arr1, arr2));
return 0;
}
//strnca-不受字符限制的字符连接函数
#define _CRT_SECURE_NO_WARNINGS 1
int main()
{
char str1[20];
char str2[20];
strcpy_s(str1, "To be");
strcpy_s(str2, "or not to be");
strncat_s(str1, str2, 12);
puts(str1);
return 0;
}
那么strcat函数该如何模拟实现呢?
char* My_strcat(char* dest, char* src)
{
assert(dest && src);
char* ret = dest;
while (*dest)
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return ret;
}
4.strstr
//strstr 函数 数据查找函数
//在一个字符串之中寻找子字符串
int main()
{
char arr1[] = "i am a good student,hehe student";
char arr2[] = "student";
char* ret = strstr(arr1, arr2);
printf("%s\n", ret);
return 0;
}
那么strstr函数该怎么实现呢?
char* My_strstr(char* str1, char* str2)
{
assert(str1 && str2);
char* s1;
char* s2;
char* cp = str1;
while (*cp)
{
s1 = cp;
s2 = str2;
while (*s1 && *s2 && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return cp;
}
cp++;
}
return NULL;
}
5.memmove
int main()
{
char str[] = "memmove can be very useful......";
memmove(str + 20, str + 15, 11);
puts(str);
return 0;
}
它的模拟实现是什么样呢?
void* My_memmove(char* dst, const char* src, int num)
{
void* ret = dst;
if (dst <= src || (char*)dst >= ((char*)src + num))
{
while (num--)
{
*(char*)dst = *(char*)src;
dst++;
src++;
}
}
else
{
dst = dst + num - 1;
src = src + num - 1;
while (num--)
{
*(char*)dst = *(char*)src;
dst--;
src--;
}
}
return (ret);
}
6.memcpy
void* memcpy(void* dst, void* src, int num)
{
void* ret = dst;
assert(dst&&src);
while (num--)
{
*(char*)dst =*(char*) src;
dst = (char*)dst + 1;
src = (char*)src + 1;
}
return ret;
}
}
## 6.memcpy
```c
void* memcpy(void* dst, void* src, int num)
{
void* ret = dst;
assert(dst&&src);
while (num--)
{
*(char*)dst =*(char*) src;
dst = (char*)dst + 1;
src = (char*)src + 1;
}
return ret;
}