1. 程式人生 > >模擬實現strcpy、模擬實現strlen、模擬實現strstr函式

模擬實現strcpy、模擬實現strlen、模擬實現strstr函式

1.模擬實現strcpy(strcpy函式的功能是實現字串的複製)

方法一:

演算法思想:定義兩個指標變數dest、str,分別指向目的字串、原字串,只要str指向的內容不為\0,完成複製,返回目的字串的首地址

注意

(1)將原字串指標定義為 const型別(只讀,不可修改)

(2)這個函式是模擬strcpy庫函式,其返回值是目的字串的地址,所以呼叫時直接以%s(字串形式) 返回目的字串首地址,即可返回出被複制好的字串

(3)由於執行程式時改變了原、目的字串指標,所以記得開始講目的字串首地址加以儲存

程式:

#include <stdio.h>
char *my_copy(char *dest, const char *str)
{
	char *ret=dest;  //將目的指標保留,因為執行完下面的語句,目的指標dest已經指向字串末尾
	while(*dest++ = *str++)  //只要原字串中字元不為\0,完成複製
		;
		return ret;
}
int main()
{
	char arr1[64];
	char arr2[]="hello world";
	my_copy(arr1, arr2);
	printf("%s\n",arr1);
	return 0;
}
方法二:

演算法思想:利用指標作用,將字串中的每一個字元一個一個複製

注意:

(1)字串常量不能被改變,所以接收字元時,應該定義一個稍微大一點的字元陣列接收傳過來的字元

(2)記得將指向陣列一的指標儲存起來,否則經過下面的語句之後指標就被修改

程式:

#include <stdio.h>
int main()
{
	//int i=0;
	char arr1[10]={0};  //定義一個字元陣列來接收各個字元
	char arr2[]="defg";
	char *p1=arr1;
	char *p2=arr2;
	char *p3=NULL;
	p3=p1;  //將指向陣列一的指標儲存起來,否則經過下面的語句之後指標就被修改
	while((*p2) != '\0')
	{
		*p1=*p2;  //按照每次傳一個字元的方式
		p2++;
		p1++;
	}
	while((*p3) != '\0')  
	{
		printf("%c ",*p3);
		p3++;
	}
	return 0;
}

2.模擬實現strlen(strlen函式的功能是計算字串長度,不包括'\0')

方法一:

演算法思想:編寫函式,定義一個指標1,再定義一個指標2,先用指標2將指標1指向保留,然後設定迴圈,只要指標2指向內容不為\0,將指標2向後移動,計數器加1,最後跳出

迴圈後,指標2指向\0;這時候指標2減去指標1就是原來字串的長度

注意

(1)主函式呼叫函式時,避免裡面變數未定義,直接將呼叫函式作為引數使用(這裡值printf函式)

(2)跳出迴圈時,str指向\0;這時str-star(開始指標)就為字串長度

(3)編寫函式沒有具體字串什麼的,都是乾貨

程式:

#include <stdio.h>
int my_strlen(const char *str)
{
	//assert(str);
	int count=0;
	const char *star=str;  //定義指標star,並且指向和指標str指向相同的空間
	while(*str)  //只要str指向的內容不為\0,就將指標向後移動,並且計數器加加
	{
		count++;  
		str++;
	}
	return str-star;  //跳出while迴圈時,str指向最後一個字串的下一個位置(‘\0’處)
}
int main()
{
	char *p="hello world";
	printf("%d",my_strlen(p));
	return 0;
}
方法二:

演算法思想:定義一個指標指向字串首地址,只要指標指向內容不為'\0',計數器加一,並且將指標向後移動,最後統計計數器數字

注意

(1)存字串的陣列應該是char型別的

程式:

#include <stdio.h>
int main()
{
	int count=0;
	char arr[]="abcdef";
	char *p1=arr;  //指標p1中存放陣列arr首元素地址,注意應該是陣列型別的指標
	while((*p1) != '\0')
	{
		count++;
		p1++;
	}
	printf("%d",count);
	return 0;
}
3.模擬實現strstr(strstr函式的功能是實現判斷一個字串是否是一個字串的子串)

演算法思想:分別用從第一個字元開始兩個指標操作目標串和模式串,只要對應字元相等則各自加加,只要不相等了,就會模式串回到開頭,把t_old加一,再判斷,再將

t_old賦值給t_strat,每次這樣,這就保證t_old肯定是匹配全一樣時那段的開頭;若最終模式串的指標指向'\0',說明找到了這時返回那個用來記錄匹配相等時那個首地址(t_old)

注意:

(1)保證當模式串長度大於目標串時,也屬於查詢失敗情況,返回NULL

(2)注意使用t_old指標保留匹配成功時候目標串的首地址

#include <stdio.h>
#include <windows.h>
#pragma warning (disable:4996)

char *my_strstr(const char *target, const char *pattern)
{
	const char *t_start=target;  //再定義兩個指標操作目標字串、模式串(子串)
	const char *p_start=pattern;
	const char *t_old=target;  //再定義一個指標用來儲存開始指標
	while(*t_old)
	{
		t_start=t_old;//只有break跳出來到這,說明對應字元不相等,為記錄匹配相等時目標字串首地址
		while(*t_start && *p_start)
		{
			if(*t_start==*p_start)  //兩個字串中的對應字元相同,各自指標向後移動
			{
				t_start++;
				p_start++;
			}
			else  //對應字元不相等時,模式串應該回到首元素,目標串應該回到開始比較時的下一個字元
			{
				p_start=pattern;
				t_old++;
				break; 
			}
		}
		if(*p_start=='\0')  //說明成功找到
		{
			return t_old;
		}
		if(*p_start!='\0' && *t_start=='\0')  //說明目標字串長度小於模式串
		{
			return NULL;
		}
	}
	return NULL;  //如果來到這說明分別不是以上情況,則也是沒找到,否則return 結束本函數了
}


相關推薦

C 自己實現strcpy,strcmp,strlen,strcat等函數

求字符串長度 ret div str 實現 字符串 brush r++ 長度 /* 1. 求字符串長度函數 */ int myStrlen(char *str) { int cnt = 0; while(*str++ != ‘\0‘) { cn

C語言字串函式總結:模擬實現常用的字串類函式strlenstrcpystrcmp........)

總結:模擬實現常用的字串類函式(strlen、strcpy、strcmp……..) 1. strlen 2. strcpy 3. strcat 4. strstr 5. strchr 6. strcmp 7. memcpy 8. m

模擬實現strcpy模擬實現strlen模擬實現strstr函式

1.模擬實現strcpy(strcpy函式的功能是實現字串的複製) 方法一: 演算法思想:定義兩個指標變數dest、str,分別指向目的字串、原字串,只要str指向的內容不為\0,完成複製,返回目的字串的首地址 注意: (1)將原字串指標定義為 const型別(只讀,不可修

MongoDB分片群集(實現分片服務啟用分片服務管理單點故障模擬

Opens 取數 page use chmod 組成 壓力 多個 clu MongoDB分片概述 1、什麽是分片 高數據量和吞吐量的數據庫應用會對單機的性能造成較大壓力,大的查詢量會將單機的CPU耗盡,大的數據量對單機的存儲壓力較大,最終會耗盡系統的內存而將壓力轉移到磁盤

callapplybind的區別,模擬callapply和bind的實現

bind:bind繫結完this的指向後會返回一個新的函式體,不會被立即呼叫   call&apply:繫結完this的指向後會立即呼叫   call與apply的區別:     call:第一個引數是this的指向,

【c語言】利用指標模式實現字串函式strlenstrcatstrstrstrcpystrcmpmemcpymemove)

模擬實現strlen int my_strlen(const char *p) { assert(p != NULL); char *s = p; while (*p) { p++; } r

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

什麼是C語言中的字串 字串或串(String)是由數字、字母、下劃線組成的一串字元。通常放在常量字串中或者字元陣列中。C語言中以 ‘\0’ 來作為字串的結束標記。 字元的ASCII編碼表 1.strlen 功能:字串求長 計算給定字串的(unsigned in

c#模擬網頁實現12306登陸自動刷票自動搶票完全篇

 這一篇文章,我將從頭到尾教大家使用c#模擬網頁面登陸12306網站,自動刷票,選擇訂票人,到最後一步提交訂單。研究過HTTP協議的童鞋們都知道,我們在訪問網站時,是有兩種方式的,POST和GET方式,HTTP協議是TCP/IP的一部分,有興趣的可以使用Socket通訊可

【c++】模擬實現迴圈佇列 三種方法(標識浪費一個空間計數器)

什麼是迴圈佇列? 為充分利用向量空間,克服”假溢位“現象的方法:將向量空間想象為一個首尾相接的圓環,並稱這種向量為迴圈向量。儲存在其中的佇列稱為迴圈佇列(Circular Queue)。 假象成如圖: 但實際上儲存空間還是一段連續的空間。 空佇列: 當有元素入隊時:

模擬實現strcpy函數

c++ span printf style use while strcpy r++ abc 模擬實現strcpy函數 a、代碼簡練的 1 #include<stdio.h> 2 #include<assert.h> 3 4 //模擬實現

模擬實現strcpy函式功能(優化改進)

strcpy函式,字串拷貝函式,傳入兩個引數,將第二個引數的值拷貝到第一個中去。 首先,給出一個普通的程式碼: #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> void

模擬實現strcpy和strcat的函式實現

#include<stdio.h> #include<Windows.h> #include<assert.h> char* my_strcpy(char* dest, const char* src) { char *ret1 = dest;//記錄目標字

No.25 經典筆試題(二):模擬實現strcpy,strcat,strcmp,strstr,memcpy

直接上程式碼: 1. //模擬實現strcpy #include <stdio.h> #include <assert.h> char* my_strcpy(char* dest, const char* src) { char* ret = dest ;

模擬實現strcpy 和strcat

模擬實現strcpy : char *My_strcpy(char *dest, const char *src) { char *ret = dest; assert(NULL != dest); assert(NULL != src); while((*dest++ = *src++

c語言模擬實現strcpy

//模擬實現strcpy    概念:              //strcpy(str1,st2)將陣列str2的值複製到陣列str1   解題思路:整體比較簡單                    1> 將數組裡的值一個個拷貝到另個數組;       

【C語言】模擬實現strcpy strcat strstr strcmp

模擬實現strcpy(字串拷貝) 這道題,是將原字串的內容拷貝到目標字串中去,一個字元一個字元的拷貝直到遇到 ‘\0’ ,將它也拷貝過去後停止。  #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include&

string庫之模擬實現strcpy與strncpy

原型:      C庫string.h中strcpy函式 描述:      C 庫函式 char *strcpy(char *dest, const char *src) 把 src 所指向的字串複製到 dest。 引數:     dest指向用於儲存複製內容的目標陣列。s

[c語言]codeday15找出陣列中出現一次的兩個值以及喝汽水模擬實現strcpy

1.一個數組中只有兩個數字是出現一次, 其他所有數字都出現了兩次。 找出這兩個數字,程式設計實現 #include<stdio.h> void find(int arr[],int len,int *m,int *n) { int s = 0;

【機器學習算法-python實現】PCA 主成分分析降維

pre gre text iss 主成分分析 int 找到 nts 導入 1.背景 PCA(Principal Component Analysis),PAC的作用主要是減少數據集的維度,然後挑選出基本的特征。 PCA的主要思想是移動坐標軸,找

學習筆記TF016:CNN實現數據集TFRecord加載圖像模型訓練調試

quest oba lose 神經元 byte 足夠 jpg eight 值轉換 AlexNet(Alex Krizhevsky,ILSVRC2012冠軍)適合做圖像分類。層自左向右、自上向下讀取,關聯層分為一組,高度、寬度減小,深度增加。深度增加減少網絡計算量。 訓練模