库函数的模拟实现

一、strlen

1.使用

比较简单,直接上代码

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>

int main()
{
	char arr[] = "abcdef";
	int sz = strlen(arr);
	printf("%d\n", sz);
	return 0;
}

结果:6

2.模拟实现

1)计数器

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>

int my_strlen(const char* p)
{
	int count = 0;
	while (*p++)
	{
		count++;
	}
	return count;
}

int main()
{
	char arr[] = "abcdef";
	int sz = my_strlen(arr);
	printf("%d\n", sz);
	return 0;
}

2.指针-指针

int my_strlen(const char* p)
{
	int count = 0;
	char* start = p;
	while (*p++)
	{
		;
	}
	//p指向'\0'停止循环,但还会进行一次++,所以下面用--p
	return --p - start;
}

3.递归

二、strcpy

1.使用

直接上代码

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>

int main ()
{
  char str1[]="Sample string";
  char str2[40];
  char str3[40];
  strcpy (str2,str1);
  strcpy (str3,"copy successful");
  printf ("str1: %s\nstr2: %s\nstr3: %s\n",str1,str2,str3);
  return 0;
}

结果:

str1: Sample string
str2: Sample string
str3: copy successf

2.模拟实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>

char* my_strcpy(char* dst, const char* src)
{
	char* cp = dst;
	assert(dst && src);

	while (*cp++ = *src++)
		;
	return(dst);
}
int main()
{
	char arr1[10];
	char  arr2[] = "hello";
	printf("%s\n", my_strcpy(arr1, arr2));
	return  0;
}

三、strcmp

1.使用

  char key[] = "apple";
  char buffer[80];
  do {
     printf ("Guess my favorite fruit? ");
     fflush (stdout);
     scanf ("%79s",buffer);
  } while (strcmp (key,buffer) != 0);
  puts ("Correct answer!");

只有输入的字符串等于 "apple"才会输出Correct answer!

2.模拟实现

strcmp是怎么比较两个字符串的大小的?

比较第一个不相等的字符的ASCLL码值的大小

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>

int my_strcmp(const char*key, const char* buffer)
{
    while (*key++ == *buffer++ && *key != '\0');
    {
        ;
    }
    return (*key - *buffer);
}

int main()
{
    char key[] = "apple";
    char buffer[80];
    do {
        printf("Guess my favorite fruit? ");
        fflush(stdout);
        scanf("%79s", buffer);
    } while (my_strcmp(key, buffer) != 0);
    puts("Correct answer!");
	return 0;
}

四、strcat

1.使用

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>

char* my_strcat(char* dest, const char* src)
{

}
int main()
{
	char str[80];
	strcpy(str, "these ");
	strcat(str, "strings ");
	strcat(str, "are ");
	strcat(str, "concatenated.");
	puts(str);
	return 0;
}

2.模拟实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>

char* my_strcat(char* dest, const char* src)
{
	char* start = dest;
	while (*start)
	{
		start++;
	}
	while (*start++ = *src++)
	{
		;
	}
}
int main()
{
	char str[80];
	strcpy(str, "these ");
	my_strcat(str, "strings ");
	my_strcat(str, "are ");
	my_strcat(str, "concatenated.");
	puts(str);
	return 0;
}

五、strstr

在一个字符串中找一个字符串第一次出现的位置

1.使用

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>

int main()
{
    char str[] = "This is a simple string";
    char* pch;
    pch = strstr(str, "simple");
    if (pch != NULL)
        strncpy(pch, "sample", 6);
    puts(str);
    return 0;
}

2.模拟实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <assert.h>

char* my_strstr(char* str1, char* str2)
{
    char* p = str1;
    char* s1 = p;
    char* s2 = str2;
    assert(s1 && s2);
    if (*s2 == '\0')
        return str1;
    while (*p)
    {
        s1 = p;
        s2 = str2;
        while (*s1 == *s2 && s1 && s2)
        {
            s1++;
            s2++;
        }
        if (*s2 == '\0')
            return p;
        p++;
    }
    return NULL;
}
int main()
{
    char str[] = "This is a simple string";
    char* pch;
    pch = my_strstr(str, "simple");
    if (pch != NULL)
        strncpy(pch, "sample", 6);
    puts(str);
    return 0;
}

  • 16
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值