库函数是干什么的?
库函数的实现之所以叫库函数,是因为编译软件已经写好,而在使用的时候只需要调用,引到头文件即可,但是在面试的时候,当用到库函数,比如用strlen来求字符串的长度。如果能写出自己理解的代码,往往是面试官最喜欢的。
1.实现strcpy(字符串的拷贝)
2.实现strcat(字符串的链接)
3.实现strstr(第一个字符串是否为第二个字符串的子字符串)
4.实现strchr(字符串s中首次出现字符c的位置)
5.实现strcmp(字符串的比较)
6.实现memcpy(内存拷贝)
7.实现memmove (内存拷贝(重叠区域的拷贝))
8.实现strlen(字符串的长度)
源代码:(无相应的头文件)
1.实现strcpy
char * my_strcpy(char *dest, const char *src)
{
assert(dest);
assert(src);
char *ret = dest;
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[] = { 0 };
char arr2[] = "efg";
my_strcpy(arr1,arr2);
printf("%s\n",arr1);
system("pause");
return 0;
}
char *my_strcat(char* dest, const char* src)
{
assert(dest!=NULL);
assert(src!=NULL);
char *ret = dest;
while (*dest)
{
dest++;
}
while ((*dest++ = *src++))
{
;
}
return ret;
}
int main()
{
char arr1[] = "abcd";
char arr2[] = "efg";
char* ret=my_strcat(arr1, arr2);
printf("%s\n",ret);
system("pause");
return 0;
}
3.实现strstr
char* my_strstr(const char *str1, const char *str2)
{
assert(str1 != NULL);
assert(str2 != NULL);
if (*str2 == '\0')
{
return str1;
}
while (*str1)
{
const char *p = str1;
const char *q = str2;
while (*p != '\0'&&*q != '\0' && (*p == *q))
{
p++;
q++;
}
if (*q == '\0')
{
return str1;
}
str1++;
}
return NULL;
}
int main()
{
char arr1[] = "abbbbcd";
char arr2[] = "bbc";
char *ret =my_strstr(arr1, arr2);
printf("%s\n",ret);
system("pause");
return 0;
}
4.实现strchr
char* my_strchr( char*dest, char src)
{
char *p = dest;
assert(dest != NULL);
while (*p != src)
{
p++;
if (*p == '\0')
{
return NULL;
}
}
return p;
}
int main()
{
char arr1[] = "abcd";
char *ret = my_strchr(arr1, 'c');
printf("%s\n",ret);
system("pause");
return 0;
}
5.实现strcmp
int my_strcmp(const char* dest, const char*src)
{
int ret = 0;
assert(dest != NULL);
assert(src != NULL);
while (*dest == *src)
{
if (*src == '\0')
{
return 0;
}
dest++;
src++;
}
if (*dest > *src)
return 1;
else
return -1;
}
int main()
{
char arr1[] = "abcd";
char arr2[] = "acaa";
int ret=my_strcmp(arr1, arr2);
printf("%d\n",ret);
system("pause");
return 0;
}
6.实现memcpy
void *my_memcpy(void *str1, const void *str2, size_t count)
{
assert(str1 != NULL);
assert(str2 != NULL);
void *ret = str1;
while (count)
{
*(char*)str1 = *(char*)str2;
str1 = (char*)str1 + 1;
str2 = (char*)str2 + 1;
count--;
}
return ret;
}
int main()
{
int arr1[9] = { 0 };
int arr2[9] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int i = 0;
my_memcpy(arr1, arr2, 36);
for (i = 0; i < 9; i++)
{
printf("%d ", arr1[i]);
}
system("pause");
return 0;
}
7.实现memmove
void *my_memcpy(void *str1, const void *str2, size_t count)
{
assert(str1 != NULL);
assert(str2 != NULL);
void *ret = str1;
if (str1 > str2)
{
while (count)
{
*(char*)str1 = *(char*)str2;
str1 = (char*)str1 + 1;
str2 = (char*)str2 + 1;
count--;
}
}
else
{
while (count)
{
*((char*)str1 + count) = *((char*)str2 + count);
count--;
}
}
return ret;
}
int main()
{
int arr[9] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int i = 0;
memcpy(arr + 1, arr + 2, 16);
for (i = 0; i < 9; i++)
{
printf("%d ", arr[i]);
}
system("pause");
return 0;
}
8.实现strlen
int my_strlen(const char*str)
{
int count = 0;
assert(str!=NULL);
while (*str != '\0')
{
str++;
count++;
}
return count;
}
int main()
{
char arr[] = "abcdefg";
int ret=my_strlen(arr);
printf("%d\n", ret);
system("pause");
return 0;
}