c語言常見函數自編寫

//1.子字符串查找,如果找到返回第一個字符下標,找不到返回-1 複雜度O(m*n)

int strfind(const char * str,const char* substr)
{
	if(str==NULL||substr==NULL)
	{
		return -1;
	}

	int len1=strlen(str);
	int len2=strlen(substr);
	if(len1<len2)
		return -1;
	int c=len1-len2;
	int i,j;
	for(i=0;i<=c;i++)
	{
		
		for( j=0;j<len2;j++)
		{
			if(str[i+j]!=substr[j])
				break;
		}
		if(j==len2)
			return i+1;

	}
	return -1;
}


//2.在字符轉中找到第一個只出現一次的字符
char FirstCharNotRepeated(const char *str)
{
	int table[256];
	if(!str)
	{
		return '\0';
	}
	for(int i=0;i<256;i++)
	{
		table[i]=0;
	}
	int len=strlen(str);
	for(int i=0;i<len;i++)
	{
		table[str[i]]++;
	}

	for(int i=0;i<len;i++)
	{
		if(table[str[i]]==1)
			return str[i];
	}
	return '\0';

}


//3.字符串拷貝
char *strcpy(char *dest,const char* src)
{
	if(dest==src)
	{
		return dest;
	}
	assert(dest!=NULL&&src!=NULL);
	char* p=dest;
	while(*src!='\0')
	{
		*dest++=*src++;
	}
	*dest='\0';
	return p;
}

//4.查找字符串首次出現的字符位置
char * strchr( char *str,char c)
{
	assert(str!=NULL);
	while(*str++!='\0')
	{
		if(c==*str)
			return str;
	}
	return NULL;
	
}

//5.字符串比較
int strcmp(const char *s1,const char *s2)
{
	assert(s1!=NULL&&s2!=NULL);
	while(*s1&&*s2&&*s1==*s2)
	{
		s1++;
		s2++;
	}
	return (*s1-*s2);
}
//6.n個字符拷貝
char *strncpy(char *dest,const char * src,unsigned int n)
{
	assert(dest!=NULL&&src!=NULL);
	char  *p=dest;
	while(n--&&*src!='\0')
	{
		*dest++=*src++;
	}
	*dest='\0';
	return p;
}

//7.字符串拼接
char *strcat(char *dest,const char *src)
{
	assert(dest!=NULL&&src!=NULL);
	char *p=dest;
	while(*dest++!='\0');
	while(*src!='\0')
		*dest++=*src++;
	*dest='\0';
	return p;
}

//8.求字符串長度
int strlen1(const char *str)
{
	assert(str!=NULL);
	int len=0;
	while(*str++!='\0')
		len++;
	return len;
}

//9.將字符串拷貝到新的位置
char *dup(char *src)
{
	if(src!=NULL)
	{
		int len=0;
		char *temp=src;
		while(*src++!='\0')
			len++;
		char *start=(char*)malloc(sizeof(char)*(len+1));
		assert(start!=NULL);
		while(*temp!='\0')
			*start++=*temp++;
		*start='\0';
		return (start-len);
	}
	return NULL;
}

//10.從src中取n個字符拼接到dest後面
char *strncat(char *dest,const char *src,unsigned int n)
{
	assert(dest!=NULL&&src!=NULL);
	char *p=dest;
	while(*dest++!='\0');
	while(n--&&*src!='\0')
		*dest++=*src++;
	*dest='\0';
	return p;
}

//11.字符翻轉
char *strrev(char *str)
{
	assert(str!=NULL);
	char *s=str,*s2=str,temp;
	while(*s!='\0')
		s++;
	--s;
	while(s2<=s)
	{
		cout<<*s<<*s2<<endl;
		temp=*s;
		*s=*s2;
		*s2=temp;	 
		s2++;
		s--;
	}
	return str;
}
//12.將src數組的count個字節搬到destiny數組
void *memcpy(void *dest, const void *src, unsigned int count) 
{
	assert(dest!=NULL&&src!=NULL);
	void *p=dest;
	while(count--&&*(char*)src!='\0')
	{
		*(char*)dest=*(char*)src;
		dest=(char*)dest+1;
		src=(char*)src+1;
	}
	return p;
}
//13.將s所指向的某一塊內存中的每個字節的內容全部設置爲ch指定的ASCII值
void *memset(void *s, int ch, unsigned n)
{
	assert(s!=NULL);
	void *p=s;
	while(n--)
	{
		*(char*)p=(char)ch;
		p=(char*)p+1;
	}
	return s;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章