1. 程式人生 > >1.實現strcpy 2.實現strcat 3.實現strstr 4.實現strchr 5.實現strcmp 6.實現memcpy 7.實現memmove

1.實現strcpy 2.實現strcat 3.實現strstr 4.實現strchr 5.實現strcmp 6.實現memcpy 7.實現memmove

    在前面介紹了字串的一個大概,真正的掌握需要大量程式碼的磨練。下面介紹幾個字串常用的幾個函式,這些函式都是在<string.h>裡面,這裡是介紹原理,進行模擬還原,也就是自己寫這個函式,實現原有功能。可能有一些語言表達不好的地方,或者有些地方的語言生硬,難以理解。請諒解,因為我是理科生。下面我們來:

(說一句哦,這裡面的字串有些是沒有進行是否為空的判斷,自行參考一下。assert())

1.實現strcpy

     這個函式是一個複製的作用。copy嘛。在實際運用中應該就是需要需要修改某一個字串,但是又要保留原有資料,這就需要把它複製到另一個字串裡面。好聽的,克隆呀。話不多說,奉上程式碼

//C語言

//模擬實現strcpy

//strcpy的格式是
//strcpy(str,str2)
//將str整個複製到str2
char* strcpy1(char* str,char* str2) {
	char* start = str;        //指向被複制字串的頭個元素的指標
	char* start2 = str2;      //指向要複製字串的投個元素的指標
        int leng = strlen(str);
	while (start!=(str+leng+1)) {//一定要注意倆字串的長度啊。因為字串後面還有個'\0'
		*start2 = *start;    
		++start;
		++start2;
	}
	return str2;
}

2.實現strcat

這個函式是

原來連線兩個字串的,catenate喲。它的用法簡單直觀啊,所以直接奉上程式碼

//C語言

//模擬實現strcat
void my_strcat(char* str,char* str2,int leng) {
	char str3[] = "0";
	//char* num = str3;
	char* p1 = str;
	char* p2 = str2;
	char* p3 = str3;
	while (p3!=(str3+leng+1)) {
		while (*p1 != '\0') {//第一個字串到最後的結束標記時就該連線下一個字串了
		*p3 = *p1;
		++p1;
		++p3;
		}
			*p3 = *p2;//這個時候p3是等於p1的'\0'時候的長度哦
			++p2;
			++p3;
		
	}
	printf("%s\n",str3);
}

3.實現strstr

這個函式是用來判斷一個字串是不是另一個字串的字串。下面的程式碼怕是有點不好理解。

int my_strstr(char* str1,char* str2) {
//先假設str2是str1的字串
	char* p1 = str1;
	char* p2 = str2;
	char* flag = str1;//這都是指向第一個元素的指標。這個是標記用的。後面見
		
	if (*p2 == '\0'){//如果子串直接是空。那就不用進行下去了。
		return 0; 
        }
		while (*p1) { //while的判斷條件要非0嘛。就要*p1到最後一個字元後退出迴圈,

			flag = p1; //見到標記了吧。指向第一個元素
			p2 = str2;

			while (*flag && *p2 && (*flag == *p2)) //要都不為空,且要倆指標的元素相等
			{ 
				flag++; 
				p2++; //指向下一個元素
			} 
				if (*p2 == '\0'){ //字串最後一個元素都匹配了,那就是字串了
					return 1; 
                                }

				++p1; //這個有點難懂不?這個就是如果兩個元素遇到不相等的,那就重新來比較,第一個字串的元素向下一個移動來匹配。而字串就回到第一個元素繼續匹配
//這裡舉一個例子
//str1[]="bbcdefg"
//str2[]="bcde";
//第一個元素相等的,但是第二元素不等,這時候str1移動下一個元素,str2回到首位繼續比較
//然後就相等了。總之這是為了防止字串有重合的元素影響比較。
		} 
	return 0; //最後一個字元都沒有匹配上,那就過分很了,不是子串
    }
}

4.實現strchr

這個函式是查詢字串中首次出現某個字元的位置,chr是character的縮寫,應該是昂,然後這個應該好理解吧,這個函式返回的是一個位置哦,不是是否有這個字元。下面奉上程式碼。

//C語言
int my_strchr(char* str,char ch) {
	char* p = str;        //指向首個元素char* pch = ch;
	int adress = 0;        //位置標記
	while (*p!=ch) {
		++p;
		++adress;
		if (*p=='\0') {
			return 0;
		}
	}
	return adress+1;        //+1是為了好看,因為字元是從第0個位置開始的,人從第一個開始數
}

5.實現strcmp

這是倆字串的比較函式。cmp一看就是compare對吧。兩個字元串自左向右逐個字元相比(按ASCII值大小相比較),直到出現不同的字元或遇'\0'為止。這裡不是比較是否相同,還有這裡面只能比較字串,即可用於比較兩個字串常量,或比較陣列和字串常量,不能比較數字等其他形式的引數。敲黑板!注意一下昂。奉上程式碼

//C語言
int my_strcmp(char* str1,char* str2) {
	char* p1 = str1;
	char* p2 = str2;
	while (*p1==*p2) {
		++p1;
		++p2;
	}
	if (*p1<*p2) {
		return -1;
	}
	else if (*p1==*p2) {
		return 0;
	}
	else {
		return 1;
	}
}

6.實現memcpy(預告版)

這也是拷貝的函式,但是這個點高階就是從源字串起始位置開始拷貝指定個位元組到目標字串中。當你要拷貝大於原字串長度的時候,也就是 n 大於原字串長度,strncpy 會用 ‘\0’ 來填充,而 memcpy 則會在原字串所在地址按照長度拷貝記憶體裡的值,所以多餘的字元是記憶體中不確定的值。這裡的strncpy是strcpy的進階。程式碼奉上

//語言
//實現memcp
char* my_memcpy(char* str1,char* str2,int num) {
	char* start = str1;
	char* start2 = str2;
	while (num--){
		*start2 = *start;
		++start;
		++start2;
	}
	*start2 = '\0';//字串的結尾有'\0'別忘了,不不然列印的時候就會燙
	return str2;
}

7.實現memmove(預告版)

   這是memcpy的優化版。函式memcpy()   從source  指向的區域向dest指向的區域複製count個字元,如果兩陣列重疊,不定義該函式的行為。     而memmove(),如果兩函式重疊,賦值仍正確進行。

//C語言
//實現memmove

空空如也