字符串函數

1、memset

函數原型:void *memset(void *s, int ch, size_t n);

函數解釋:將s中前n個字節 (typedef unsigned int size_t )用 ch 替換並返回 s 。

void* memset(void* s, int ch, size_t count)
{
	assert(s!=NULL);
	char* p = (char*)s;
	while (count--)
	{
		*p++ = ch;
	}
	return s;
}

2、memcpy

函數原型:void *memcpy(void *dest, const void *src, size_t n);

功能:從源src所指的內存地址的起始位置開始拷貝n個字節到目標dest所指的內存地址的起始位置中

void* memcpy(void* p1,const void* p2, size_t count)
{
	assert(p1 != NULL || p2 != NULL);
	char* dst = (char*)p1;
	char* src = (char*)p2;
	while (count--)
	{
		*dst++ = *src++;
	}
	return p1;
}

3、memove

函數原型:void *memmove( void* dest, const void* src, size_t count );

功能:memmove用於從src拷貝count個字符到dest,如果目標區域和源區域有重疊的話,memmove能夠保證源串在被覆蓋之前將重疊區域的字節拷貝到目標區域中。但複製後src內容會被更改。但是當目標區域與源區域沒有重疊則和memcpy函數功能相同

void* memove(void* p1, const char* p2, size_t count)
{
	assert(p1 == NULL || p2 == NULL);
	char* dst = (char*)p1;
	const char* src = (const char*)p2;
	if ((dst > src) && (dst < src + count))
	{
		//while (count--)
		//{
		//	*dst = *src;
		//	dst++;
		//	src++;
		//}//以上寫法是錯誤的
		dst = dst + count - 1;
		src - src + count - 1;
		while (count--)
		{
			*dst = *src;
			dst--;
			src--;
		}
	}
	else
	{
		while (count--)
		{
			*dst = *src;
			dst++;
			src++;
		}
	}
	return dst;
}

4、memcmp

原型:int memcmp(const void *buf1, const void *buf2, unsigned int count);

功能:比較內存區域buf1和buf2的前count個字節。

說明:當buf1<buf2時,返回值<0 

           當buf1=buf2時,返回值=0 

           當buf1>buf2時,返回值>0

int memcmp(const void* p1,const void* p2, size_t count)
{
	assert(p1 != NULL&&p2 != NULL);
	int ret = 0;
	const char* src = (const char*)p1;
	const char* dst = (const char*)p2;
	if (count == 0)
	{
		return 0;
	}
	while (--count&&*src == *dst)
	{
		src++;
		dst++;
	}
	return (*((unsigned char*)src) - *((unsigned char*)dst));

}

5、strcpy

原型聲明:char *strcpy(char* dest, const char *src);

功能:把從src地址開始且含有NULL結束符的字符串複製到以dest開始的地址空間

說明:src和dest所指內存區域不可以重疊且dest必須有足夠的空間來容納src的字符串。

返回指向dest的指針。

char* strcpy(char* dst, const char* src)
{
	assert(dst != NULL&&src != NULL);
	char* start = dst;
	while ((*dst++ = *src++) != '\0');
	return start;
}

6、strncpy

函數原型char*strncpy(char*dest,char*src,size_tn);

功能:(c/c++)複製字符串src中的內容(字符,數字、漢字....)到字符串dest中,複製多少由size_tn的值決定。

1)src串長度<=dest串長度,(這裏的串長度包含串尾NULL字符)

如果n>src由於長度達到src NULL,正常複製,特別注意,如果src中有NULL,strncpy複製到NULL即使沒到n也提前停止。如果n = src串長度,與strcpy一致。注意n的選擇當n > dest串長度,dest棧空間溢出產生崩潰異常。

2)src串長度>dest串長度

如果n =dest串長度,則dest串沒有NULL字符,會導致輸出會有亂碼。如果不考慮src串複製完整性,可以將dest 最後一字符置爲NULL。



char* strncpy(char* dst, const char* src, size_t count)

{

assert(dst != NULL&&src != NULL);

char* start = dst;

while (count && (*dst++ = *src++) != '\0')

{

count--;

}

if (count)

{

while (count--)

{

*dst++ = '\0';

}

}

return start;

}

7、strcat

函數原型extern char *strcat(char *dest,char *src);

功能:把src所指字符串添加到dest結尾處(覆蓋dest結尾處的'\0')。

說明:src和dest所指內存區域不可以重疊且dest必須有足夠的空間來容納src的字符串。

返回指向dest的指針

char* strcat(char* dst, const char* src)
{
	assert(dst != NULL || src != NULL);
	char* start = dst;
	while (*dst)
	{
		dst++;
	}
	while (*dst++ = *src++)
		;
	return start;
}

8、strncat

函數原型:char * strncat(char *dest, const char *src, size_t n);

【參數說明】:dest指向目標字符串,src爲指向源字符串。

功能:把src所指字符串的前n個字符添加到dest所指字符串的結尾處,並覆蓋dest所指字符串結尾的'/0',從而實現字符串的連接。

說明:src和dest所指內存區域不可以重疊,並且dest必須有足夠的空間來容納src的字符串。

返回值:返回指向dest的指針。

char* strncat(char* dst, const char* src, size_t count)
{
	assert(dst != NULL && src != NULL);
	char* start = dst;
	while (*dst++)
		;
	dst--;
	while (count--)
	{
		if (!(*dst++ = *src++))
			return start;
	}
	*dst = '\0';
	return start;
}

9、strcmp

函數原型:extern int strcmp(const char *s1,const char *s2);

說明:

當s1<s2時,返回爲負數;

當s1=s2時,返回值= 0;

當s1>s2時,返回正數。

即:兩個字符串自左向右逐個字符相比(按ASCII值大小相比較),直到出現不同的字符或遇'\0'爲止

int strcmp(const char* src, const char* dst)
{
	assert(dst != NULL&&src != NULL);
	int ret = 0;
	while (!(ret = *(unsigned char*)src - *(unsigned char*)dst) && *dst)
	{
		++src;
		++dst;
	}
	if (ret < 0)
	{
		ret = -1;
	}
	else if (ret>0)
	{
		ret = 1;
	}
	return ret;
}

10、strncmp

函數原型:int strncmp ( const char * str1, const char * str2, size_t num );

功能:strncmp函數是指定比較size個字符。也就是說,如果字符串s1與s2的前size個字符相同,函數返回值爲0。此函數功能即比較字符串str1和str2的前maxlen個字符。如果前maxlen字節完全相等,返回值就=0;在前maxlen字節比較過程中,如果出現str1[n]與str2[n]不等,則依次比較str1和str2的前n位,設i(i<n)爲兩字符串首次的不同位,則返回(str1[i]-str2[i]

int strncmp(const char* dst, const char* src, size_t count)
{
	assert(dst != NULL || src != NULL);
	if (count==0)
	{
		return 0;
	}
	while (--count&&*dst&&*dst == *src)
	{
		dst++;
		src++;
	}
	return (*(unsigned char*)dst - *(unsigned char*)src);
}

11、strchr

函數原型:extern char *strchr(const char *s,char c);

功能:查找字符串s中首次出現字符c的位置

說明:返回首次出現c的位置的指針,返回的地址是被查找字符串指針開始的第一個與Val相同字符的指針,如果s中不存在c則返回NULL

返回值:成功則返回要查找字符第一次出現的位置,失敗返回NULL

char* strchr(const char* str, int ch)
{
	assert(str!=NULL);
	while (*str&&*str != (char)ch)
	{
		str++;
	}
	if (*str == ch)
		return (char*)str;
	return NULL;
}

12、strlen

函數原型:extern unsigned int strlen(char *s);

功能:計算給定字符串的(unsigned int型)長度,不包括'\0'在內

說明:返回s的長度,不包括結束符NULL。

int strlen(const char* str)
{
	assert(str != NULL);
	int count;
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}
int strlen(const char* str)
{
	assert(str != NULL);
	const char* p = str;
	while (*p++)
	{
		p++;
	}
	return (int)(p - str - 1);
}
int strlen(const char* str)
{
	assert(str != NULL);
	if (*str == '\0')
	{
		return 0;
	}
	else
	{
		return strlen(str++) + 1;
	}
}

13、

char* strstr(const char* str1, const char* str2)
{
	assert(str1 != NULL&&str2 != NULL);
	const char* p = str1;
	const char* s1 = p;
	const char* s2 = NULL;
	while (*p)
	{
		s1 = p;
		s2 = str2;
		while (*s1&&*s2&&*s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return (char*)p;
		}
		p++;
	}
	return NULL;
}


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