1. 程式人生 > >C語言:模擬實現字串函式strlen,strcpy,strcat,strcmp,strchr,strstr

C語言:模擬實現字串函式strlen,strcpy,strcat,strcmp,strchr,strstr

什麼是C語言中的字串

字串或串(String)是由數字、字母、下劃線組成的一串字元。通常放在常量字串中或者字元陣列中。C語言中以 ‘\0’ 來作為字串的結束標記。

字元的ASCII編碼表
在這裡插入圖片描述

1.strlen

功能:字串求長
計算給定字串的(unsigned int型)長度,不包括 ‘\0’ 在內,引數指向的的字串必須以 ‘\0’ 結束,返回值為 size_t 無符號的。

用法:size_t strlen ( const char * str )

標頭檔案:string.h

模擬實現:

//非遞迴
int my_strlen1(const char *str)
{
	int count = 0;
	while(*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}

//遞迴
int my_strlen2(const char *str)
{
	if (*str == '\0')
	{
		return 0;
	}
	else
		return 1 + my_strlen2(str + 1);
}

執行結果:

	char str[100] = {0};
	printf("請輸入字串:");
	scanf("%s",&str);
	printf("字串長度為:%d\n",my_strlen1(str));
	printf("字串長度為:%d\n",my_strlen2(str));

在這裡插入圖片描述

2.strcpy

功能:字串串複製
把源字串複製到目標空間。源字串必須以 ‘\0’ 結束,目標空間必須可變,src 和 dest 所指記憶體區域不可以重疊且 dest 必須有足夠的空間來容納 src 的字串。

用法:
char * strcpy ( char * destination, const char * source )

標頭檔案:string.h

模擬實現:

char *my_strcpy(char *dest, const char *src)
{
	char *ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while((*dest++ = *src++))
	{
		;
	}
	return ret;
}

執行結果:

	char str1[] = "i im a boy";
	char str2[100] = {0};
	printf("src:%s\n",str1);
	printf("dest:%s\n",my_strcpy(str2, str1));

在這裡插入圖片描述

3.strcat

功能:字串連線
把兩個字串連線起來。源字串必須以 ‘\0’ 結束,目標空間必須可變。把 src 所指字串新增到 dest 結尾處(覆蓋 dest 結尾處的 ‘\0’ ), dest 必須有足夠的空間來容納 src 的字串

用法:
char * strcat ( char * destination, const char * source )

標頭檔案:string.h

模擬實現:


char *my_strcat(char *dest, const char *src)
{
	char *ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while(*dest != '\0')
	{
		dest++;
	}
	while((*dest++ = *src++))
	{
		;
	}
	return ret;
}

執行結果:

	char str1[100] = "i im";
	char str2[] = " a boy";
	printf("%s\n",my_strcat(str1, str2));

在這裡插入圖片描述

4.strcmp

功能:字串比較
設這兩個字串為str1,str2,
看ASCII碼
若str1=str2,則返回零;
若str1<str2,則返回負數;
若str1>str2,則返回正數。

用法:int strcmp ( const char * str1, const char * str2 )

標頭檔案:string.h

模擬實現:

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

執行結果:

	char *str1 = "abcde";
	char *str2 = "abcde";
	char *str3 = "abcef";
	printf("%d\n",my_strcmp(str1, str2));
	printf("%d\n",my_strcmp(str1, str3));
	printf("%d\n",my_strcmp(str3, str2));

在這裡插入圖片描述

5.strchr

功能:查詢字串str中首次出現字元c的位置
返回首次出現c的位置的指標,返回的地址是被查詢字串指標開始的第一個與Val相同字元的指標,如果str中不存在c則返回NULL。

用法:

const char * strchr ( const char * str, int character )
      char * strchr (       char * str, int character )

標頭檔案:string.h

模擬實現:

char *my_strchr(char *str, char c)
{
 
	assert(str != NULL);
	while(*str != '\0' && *str != c)
	{
		++str;
	}	
	return *str == c ?str:NULL;
}

執行結果:

	 char *str = "abcdef";
	 printf("%s\n",my_strchr(str, 'c'));

在這裡插入圖片描述

6.strstr

功能:在字串中查詢
str1: 被查詢目標 string expression to search
str2: 要查詢物件 The string expression to find
返回值:若str2是str1的子串,則返回str2在str1的首次出現的地址;如果str2不是str1的子串,則返回NULL。

用法:

const char * strstr ( const char * str1, const char * str2 );
      char * strstr (       char * str1, const char * str2 )

標頭檔案:string.h

模擬實現:

char *my_strstr(const char *dest, const char *src)
{
    assert(dest);
	while (*dest)
	{
		while ((*dest != *src) && (*dest != 0))
			dest++;
		while (*dest == *src)
		{
			const char*pdest = dest;
			const char*psrc = src;
			while(*pdest == *psrc) 
			{
				pdest++;
				psrc++;
			}
			if (*psrc == 0)
				return (char*)dest;
			else 
				dest++;
		}
	}
	    return NULL;
}

執行結果:

    char *str1 = "qwertyuiop";
	char *str2 = "yui";
	char *str3 = "ery";
	printf("%s\n", my_strstr(str1, str2));
	printf("%s\n", my_strstr(str1, str3));

在這裡插入圖片描述