天天看點

又一波str函數的模拟實作

實作strchr:查找一個字元c在另一個字元串str中第一次出現的位置找到傳回該位置的指針,找不到傳回NULL

#include <stdio.h>

char *my_strchr( const char *str, int c)
{
	while(*str)
	{
		if(*str == c)
			return (char *)str;
		*str++;
	}
	return NULL;
}

int main()
{
	char *str=NULL;
	char *arr="hello every.";
	str=my_strchr(arr,'o');
	if(str != NULL)
	{
		printf("%c\n", *str);
	}
	return 0;
}
           

實作strrchr:查找一個字元c在另一個字元串str中最後出現的位置,如果找到了傳回一直到字元串結束的所有字元。如果未能找到指定字元,那麼函數将傳回NULL

#include <stdio.h>
#include <string.h>
char * my_strrchr (const char * str,int c)
{
        char *start = (char *)str;

        while (*str++)		//尋找最後一個字元的位置       
			;			
        while ((--str != start)&&(*str != (char)c))		
			;
		if (*str == (char)c)            
			return (char *)str;
        return(NULL);
}

int main()
{
	char *arr="hello every.";
	char *ret=my_strrchr(arr,'e');
	if(ret != NULL)
	{
		printf("%s\n", ret);
	}
	return 0;
}
           

實作strrstr:在字元串中查找指定字元串最後一次出現的位置

#include <stdio.h>
#include <assert.h>

char *my_strrstr(char *str1, char *str2)
{
	char *start1=str1;
	char *start2=str2;
	char *p =str1;
	while (*p)
	{
		start1=p;
		while((*start1 != '\0')&&(*start2 != '\0')&&(*start1 == *start2))
		{
			*start1++;
			*start2++;
		}
		if(*start2 == '\0')
		{
			return p;
		}
		start2=str2;
		p++;
	}
	return NULL;
}


int main()
{
	char *arr1="hello every.";
	char *arr2="eve";
	char *ret=my_strrstr(arr1,arr2);
	printf("%s\n",ret);
	return 0;
}
           

練習使用strtok:将一個整串字元串中的某些特定字元隔開的字元分割開來

#include <stdio.h>


char *my_strtok(char *str1, const char *str2)
{
	char *p1=str1;
	char *p2=(char *)str2;
	while(*str1++ ==*str2++)
	{
		return p1;
	}
	while(*p1)
	{
		str1=NULL;
		if(*str1++ == *str2++)
			return p1;
	}
}
int main()
{
	char *str="we are happy";
	char arr[20]={0};
	char *ret=my_strtok(str," ");
	printf("%s\n",ret);
}
           

繼續閱讀