1. 程式人生 > >strlen/strcpy的實現(不使用庫函式)

strlen/strcpy的實現(不使用庫函式)

strlen功能的實現

strlen的功能:計算一串字元的長度
設計思想:返回型別為整型int,引數為一個字元型指標變數char*
int my_strlen(char* src)
用字元指標接收字元首字母的地址,當指標指向’\0’時,計數器count停止++;

程式碼如下

#include <stdio.h>
#include <assert.h>

int my_strlen(const char *src)
{
	assert(src!=NULL);	//斷言
	int count = 0;
	while (*src++)
	{
		count++
; } return count; } int main() { const char *p = "abcdef"; printf("%d\n",my_strlen(p)); return 0; }

assert的作用:防止傳輸的指標為NULL,引起錯誤,方便除錯;且在發行版本中可以優化掉。
使用時需要引標頭檔案<assert.h>
const的作用:保護指標的指向的內容不會發生變化。

執行結果:在這裡插入圖片描述

strcpy功能的實現

strcpy的功能:字串複製;
設計思想:字串複製不需要返回型別,先選擇void作為返回型別。引數可知,需要兩個字元指標char接收
void my_strcpy(char

dest, char* src)
將接收字串首地址的指標向後移動就可以得到字串中的各個字元,目標地址的指標與字串指標同步移動被賦值就完成了字串複製的功能。

程式碼如下

#include <stdio.h>
#include <assert.h>

void my_strcpy(char* dest,const char* src)
{
	assert(dest != NULL);	//斷言
	assert(src != NULL);
	while (*src)
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *
src; } int main() { const char* p = "abcdef"; char arr[10]; my_strcpy(arr,p); printf("%s\n",arr); return 0; }

優化:
分析程式時發現,while迴圈中的迴圈體既可以作為while迴圈的判斷條件,也可以完成賦值,同時還可以對兩個指標就行自增;
優化如下:

void my_strcpy(char* dest,const char* src)
{
	assert(dest != NULL);	//斷言
	assert(src != NULL);
	while (*dest++ = *src++)
	{
		;
	}
}

通過查閱資料發現:strcpy的返回型別不為void,為char* 返回了字串的首地址,所以要在指標開始移動之前儲存初始的指向地址,用char* ret = src儲存,返回ret;
:ret的作用為作為其他函式呼叫時的引數
優化程式碼如下:

#include <stdio.h>
#include <assert.h>

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

int main()
{
	const char* p = "abcdef";
	char arr[10];
	my_strcpy(arr,p);
	printf("%s\n",arr);
	return 0;
}

執行結果:
在這裡插入圖片描述