天天看點

C語言程式設計 | 模拟實作字元串操作函數:strlen, strcmp, strcpy, strcat, strchr, strstr模拟實作字元串和記憶體操作函數(一)目錄:strlenstrcpystrcatstrcmpstrstrstrchr

模拟實作字元串和記憶體操作函數(一)目錄:

  • strlen
  • strcpy
  • strcat
  • strcmp
  • strstr
  • strchr

strlen

size_t strlen(const char* str)

  • 字元串以‘\0’作為結束标志,strlen函數傳回的是在字元串中‘\0’前面出現的字元個數(不包含’\0’)。
  • 參數指向的字元串必須要以‘\0’結束。
  • 函數的傳回值為size_t,是無符号類型。
  • 因為是模拟庫函數,是以為了防止調用者放入空指針或者防止傳入的字元串被修改,下面的函數中會用到assert函數和const。
size_t my_strlen(const char* p)
{
	size_t count = 0;
	assert(p != NULL);
	while (*p)
	{
		count++;
		p++;
	}
	return count;
}
           

strcpy

char* strcpy(char* dst,const char* src)

  • strcpy把含有’\0’結束符的字元串複制到另一個位址空間,傳回值的類型為char*。
  • 源字元串必須以’\0’結束
  • 會将源字元串的’\0’拷貝到目标空間
  • 目标空間必須可變,并且具有足夠大的空間來存放源字元串
char* my_strcpy(char* dst, const char* src)
{
	char* str = dst;
	assert(dest && src);
	while (*dest++ = *src++);
	//當指針指向位置為'\0'時結束拷貝
	return str;
}

           

strcat

char* strcat(char* dst,const char* src)

  • strcat把src所指向的字元串(包括“\0”)複制到dest所指向的字元串後面。
  • 源字元串必須以’\0’結束
  • 會将源字元串的’\0’拷貝到目标空間
  • 目标空間必須可變,并且具有足夠大的空間來存放源字元串
char* my_strcat(char* dst, const char* src)
{
	assert(dst && src);
	char* str = dst;
	while (*dst)
	{
		dst++;
	}
	//找到dst的結束位置
	while (*dst++ = *src++);
	//在末尾拼接src
	*dst = *src;
	//拷貝src的'\0'
	return str;
}
           

strcmp

int my_strcmp(const char* str1, const char* str2)

  • strcmp兩個字元串自左向右逐個字元相比(按ASCII值大小相比較),直到出現不同的字元或遇’\0’為止。
  • 源字元串必須以’\0’結束
  • 當str1<str2時,傳回為負數,
  • 當str1=str2時,傳回值= 0
  • 當str1>str2時,傳回為正數
  • 需要将類型強轉為unsighed char* ,因為對比的是ASCII碼值,但是當大于127時會自動将其按照補碼的形式轉換為負數,則會産生錯誤
int my_strcmp(const char* str1, const char* str2)
{
	unsigned char* s1 = (unsigned char* )str1;
	unsigned char* s2 = (unsigned char* )str2;
	while (*s1 && *s2)
	{
		if (*s1 < *s2)
			return -1;
		else if (*s1 > *s2)
			return 1;
		else
		{
			s1++;
			s2++;
		}
	}
	
	if ('\0' == *s1 && '\0' == *s2)
		return 0;
	else if ('\0' == *s1)
		return -1;
	else
		return 1;
	//當兩邊字元數不相同的時候進行判斷
}
           

strstr

char* my_strstr(const char* src, const char* sub)

  • strstr傳回一個指針,指向sub在src中首次出現的位置。
char* my_strstr(const char* src, const char* sub)
{
	assert(src && sub);
	const char* src1 = src;
	const char* sub1 = sub;

	while (*src1)
	{
		while (*src1 == *sub1 && *sub1)
		{
			src1++;
			sub1++;
		}
		if ('\0' == *sub1)
		{
			return src;
		}
		//當*sub1指向'\0'時,說明sub1和src1完全相同,此時傳回src
		else
		{
			sub1 = sub;
			src1 = ++src;
		}
		//如果不同,則sub1回溯,*src1繼續走向下一個位置
	}
	return NULL;

}
           

strchr

char* strchr(char* dst,const char* src)

  • strchr傳回一個指向該字元串中第一次出現的字元的指針,如果字元串中不包含該字元則傳回NULL空指針。
char* my_strchr(const char* str,const char c)
{
	assert(str);
	while (*str)
	{
		if (*str == c)
			return str;
		else
			str++;
	}
	return NULL;
}
           

繼續閱讀