天天看點

【C語言】、模拟實作strlen,strcmp,strcpy,strcat,strstr函數

          strlen函數

      strlen所作的僅僅是一個計數器的工作,它從記憶體的某個位置(可以是字元串開頭,中間某個位置,甚至是某個不确定的記憶體區域)開始掃描,直到碰到第一個字元串結束符'\0'為止,然後傳回計數器值(長度不包含'\0')。

模拟實作strlen函數
#include<stdio.h>  
#include<assert.h>  
int my_strlen(const char *str)
{
	int count = 0;
	assert(str != NULL);
	while (*str != '\0')
	{
		str++;
		count++;
	}
	return count;
}
int main()
{
	int ret  = 0;
	char arr[10] = "abcdefgh";
	ret  = my_strlen(arr);
	printf("%d\n", ret);
	system("pause");
	return 0;
}
           

    strcmp函數

C/C++函數,比較兩個字元串

設這兩個字元串為str1,str2,

若str1==str2,則傳回零;

若str1<str2,則傳回負數;

若str1>str2,則傳回正數。

/模拟實作strcmp函數
#include<stdio.h>  
#include<assert.h>  

int my_strcmp(char* arr1,char* arr2)
{
  assert(arr1 && arr2);
  while(*arr1==*arr2)
  {
   if(*arr1=='\0')
     return 0;
  }
 return *arr1-*arr2;
}

int main()
{
 char *arr1="abcde";
 char *arr2="abcd";
 int ret=my_strcmp(arr1,arr2);
 printf("%d\n",ret);
return 0;
}
           

    strcpy函數

    C語言标準庫函數strcpy,把從src位址開始且含有'\0'結束符的字元串複制到以dest開始的位址空間,對src字元串一個一個進行拷貝,當遇到NULL時,dest拷貝停止。

模拟實作strcpy函數
#include<stdio.h>  
#include<assert.h>  
char* my_strcpy(char *dest,const char *src)
{
  char *cp=dest;
  assert(src && dest);
  while(*dest++=*src++)
  {
   ;
  }
  return cp;
}

int main()
{
    char arr[30]={0};
    printf("string=%s\n",my_strcpy(arr,"hello world"));
    return 0;
}
           

    strcat函數

将兩個char類型連接配接。

char d[20]="GoldenGlobal"; char *s="View"; strcat(d,s);

結果放在d中

printf("%s",d);

輸出 d 為 GoldenGlobalView (中間無空格)

d和s所指記憶體區域不可以重疊且d必須有足夠的空間來容納s的字元串。

傳回指向d的指針。

模拟實作strcat函數
#include<stdio.h>  
#include<assert.h>  

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

int main()
{
   char arr1[20]="abc";
   char *arr2="def";
   printf("%s\n",my_strcat(arr1,arr2));
   return 0;
}
           

    strstr函數

     strstr(str1,str2) 函數用于判斷字元串str2是否是str1的子串。如果是,則該函數傳回str2在str1中首次出現的位址;否則,傳回NULL!

//模拟實作strstr函數
#include<stdio.h>  
#include<assert.h>  
const char* My_strstr(const char* arr, const  char* src)
{
	const char * str1 = arr;
	const char * str2 = src;
	const char * start = NULL;
	assert(arr);
	assert(src);
	if (*str2 == '\0')
	{
		return str1;
	}
	while (*str1)
	{
		start = str1;
		while ((*str1) && (*str2) && (*str1 == *str2))
		{
			str1++;
			str2++;
		}
		if (*str2 == '\0')
		{
			return start;
		}
		str1 = start + 1;
		str2 = src;
	}
	return NULL;
}	
int main()
{
	char arr[] = "abbbccbcdefghk";
	char src[] = "bcd";
	char* ret = My_strstr(arr, src);
	if (ret == NULL)
	{
		printf("not exist!");
	}
	else
	{
		printf("%s\n", ret);
	}
	system("pause");
	return 0;
}
           

      以上就是C語言中幾種常見的函數,模拟實作的方法都比較簡單。歡迎各位朋友批評改正,新手上路,大神勿噴。謝謝大家~

【C語言】、模拟實作strlen,strcmp,strcpy,strcat,strstr函數

繼續閱讀