1. 程式人生 > >C函式:strlen,strcat,strncat,strcmp,strncmp,strcpy,strncpy,strstr詳解

C函式:strlen,strcat,strncat,strcmp,strncmp,strcpy,strncpy,strstr詳解

strlen()

原型:size_t strlen( const char *string );
功能:計算給定字串的(unsigned int型)長度,不包括'\0'在內
說明:返回s的長度,不包括結束符NULL。

//strlen(遞迴實現)
int my_strlen(const char* str)
{
	if (*str == '\0')
		return 0;
	return 1 + my_strlen(++str);
}
strcat()

char *strcat( char *strDestination, const char *strSource );

功能:把src所指字串新增到dest結尾處(覆蓋dest結尾處的'\0')。
說明:src和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容納src的字串。返回指向dest的指標。

//strcat
char* my_strcat(char* dest,  char* src)
{
	//判空
	assert(dest);
	assert(src);
	char* ret = dest;
	while (*dest != '\0')
		++dest;

	while (*dest++ = *src++)
		;
	*dest = '\0';
	return ret;
}

strncat()

char *strncat( char *strDest, const char *strSource, size_t count );
功能:把src所指字串的前n個字元新增到dest所指字串的結尾處,並覆蓋dest所指字串結尾的'\0',從而實現字串的連線。
說明:src和dest所指記憶體區域不可以重疊,並且dest必須有足夠的空間來容納src的字串

//strncat
char* my_strncat(char* dest, const char* src, int number)
{
	assert(dest != NULL&& src != NULL);
	char* ret = dest;
	while (*++dest != '\0')
		;

	while (number-- && (*dest++ = *src++))
		;
	*dest = '\0';
	return ret;

}

strcmp()

int strcmp( const char *string1, const char *string2 );

當s1<s2時,返回為負數;
當s1==s2時,返回值= 0;
當s1>s2時,返回正數。
即:兩個字串自左向右逐個字元相比(按ASCII值大小相比較),直到出現不同的字元或遇'\0'為止。如:
"A"<"B" "a">"A" "computer">"compare"
特別注意:strcmp(const char *s1,const char * s2)這裡面只能比較字串,即可用於比較兩個字串常量,或比較陣列和字串常量,不能比較數字等其他形式的引數。
ANSI標準規定,返回值為正數,負數,0 。而確切數值是依賴不同的C實現的

//strcmp(按照ASCII碼值比較)
int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 != NULL && str2 != NULL);
	int ret = 0;

	while ((ret = *str1 - *str2) && str1++)
		str2++;

	if (ret < 0)
		return -1;
	else if (ret>0)
		return 1;

	return 0;
}

strncmp()

int strncmp( const char *string1, const char *string2, size_t count );

//strncmp
int my_strncmp(const char* str1, const char* str2, int number)
{
	assert(str1 != NULL && str2 != NULL);
	int ret = 0;

	while ((ret = *str1 - *str2) && str1++ && number--)
		str2++;

	if (ret < 0)
		return -1;
	else if (ret > 0)
		return 1;
	return 0;
}

strcpy()

char *strcpy( char *strDestination, const char *strSource );
功能:把從src地址開始且含有NULL結束符的字串複製到以dest開始的地址空間
說明:src和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容納src的字串。返回指向dest的指標。

//strcpy
char* my_strcpy(char* dest, const char* src)
{
	assert(dest != NULL&& src != NULL);
	char* ret = dest;

	while ((*dest++ = *src++)!='\0')
		;
	*dest = '\0';

	return ret;

}

strncpy()

char *strncpy( char *strDest, const char *strSource, size_tcount );

//strncpy
char* my_strncpy(char* dest, const char* src, int number)
{
	assert(dest != NULL&& src != NULL);
	char* ret = dest;

	while (*dest++ = *src++ && number--)
		;
	*dest = '\0';

	return ret;
}

strstr()

strstr(str1,str2) 函式用於判斷字串str2是否是str1的子串。如果是,則該函式返回str2在str1中首次出現的地址;否則,返回NULL

//strstr
char* my_strstr(const char *string, const char *strCharSet)
{
	assert(NULL != string&&NULL != strCharSet);

	char* ptr = string;

	while (NULL != string)
	{
		string = ptr;
		while (*string != '\0'&&*strCharSet != '\0')
		{
			if (*string++ == *strCharSet++)
				;
			else
			{
				ptr++;
				break;
			}
		}
		if (*strCharSet == '\0')
			return ptr;
	}
	return 0;
}