1. 程式人生 > >[c語言]對各種字串庫函式的實現strcpy,strcat,strstr,strchr,strcmp,memcpy,memmove

[c語言]對各種字串庫函式的實現strcpy,strcat,strstr,strchr,strcmp,memcpy,memmove

1.模擬實現strcpy

//1.模擬實現strcpy(字串拷貝)
#include<stdio.h>
#include<assert.h>
char * my_strcpy(char *dest,const char *str)
{
 	char *p = dest;
	assert(dest);
 	assert(str);
 	while(*dest++ = *str++)
 	{
  		;
 	}
 return p;
}
int main()
{
 	char *arr = "hello world";
 	char a[1024] = {0};
	my_strcpy
(a,arr); puts(a); return 0; }

2.模擬實現strcat

//2.模擬實現strcat(字串拼接)
#include<stdio.h>
#include<assert.h>
char * my_strcat(char *dest,const char *src)
{
 	char *p = dest;
 	assert(src);
 	while(*dest)//不能用while(*dest++),因為strcat的功能是把src所指字串新增到dest結尾處(覆蓋dest結尾
               //處的'\0')並新增'\0',while(*dest++)在迴圈結束後還會執行一次++,會指向'\0'的下一個位置
{ dest++; } while(*dest++ = *src++) { ; } return p; } int main() { char *str = "man"; char arr[1024] = "hello "; my_strcat(arr,str); puts(arr); return 0; }

3.模擬實現strstr

//3.模擬實現strstr(字串查詢,一個字串是否是另一個字串的子串)
#include<stdio.h>
#include<assert.h>
char * my_strstr(char *
dest, const char *src) { const char *s1 = dest;//父串 const char *s2 = src;//子串 const char *cur = dest;//記錄父串地址 assert(dest); assert(src); if(*src == '\0') return dest; while(*cur) { s1 = cur; s2 = src; while(*s1 == *s2 && *s1 != '\0' && *s2 != '\0')//注意一定要判斷是否到'\0',否則會死迴圈 { s1++; s2++; } if(*s2 == '\0') { return (char *)cur; } if(*s1 == '\0') { return NULL; } cur++; } return NULL; } int main() { char *arr1 = "i am a student"; char *arr2 = "student"; char *ret = my_strstr(arr1,arr2); puts(ret); return 0; }

4.模擬實現strchr

//4.模擬實現strchr(查詢一個字元在字串首次出現的位置)
#include<stdio.h>
#include<assert.h>
char * my_strchr(const char *dest,int n)
{
 	assert(dest);
 	while(*dest)
 	{
  		if(*dest == n)
  		{
   			return (char*)dest;
  		}
  		dest++;
 	}
 	return NULL;
}
int main()
{
 	char *str = "asdfghjk,l";
 	char *ptr = my_strchr(str,'h');
 	printf("%c這個字元在%s的首字元\n",'h',ptr);
 	return 0;
}

5.模擬實現strcmp

//5.模擬實現strcmp(比較字串)
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char *str1,const char *str2)
{
	 assert(str1);
	 assert(str2);
 	while(*str1 && *str2)
 	{
  		if(*str1 > *str2)
   		return 1;
		else if(*str1 < *str2)
		return -1;
		else 
	  	{
   			str1++;
   			str2++;
  		}
 	}
 	return 0;
}
int main()
{
 	char *arr1 = "good";
 	char *arr2 = "bad";
 	int ret = my_strcmp(arr1,arr2);
 	if(ret > 0)
 	{
  		printf("字串1大於字串2\n");
 	}
 	else if(ret < 0)
 	{
  		printf("字串1小於字串2\n");
 	}
 	else
 	{
  		printf("兩字串相等\n");
 	}
 	return 0;
}

6.模擬實現memcpy

//6.模擬實現memcpy(從源指向的位置(起始位置)將count位元組的值直接複製到目標指向的記憶體塊)
#include<stdio.h>
#include<assert.h>
void *my_memcpy(void *dest,const void *src,size_t count)
{
	 char *p = dest;//給目標和源轉換型別,否則void*不知道大小
	 char *p1 = dest;
	 const char *p2 = src;
	 assert(dest);
	 assert(src);
	 while(count--)
	 {
	  	*p1++ = *p2++;
 	}
 	return p;
}
int main()
{
 	char arr1[1024] = {0};
 	char *arr2 = "hello world";
 	my_memcpy(arr1,arr2,7);
 	puts(arr1);
 	return 0;
}

7.模擬實現memmove

//7.模擬實現memmove(從源指向的位置拷貝count個位元組的值放在目標所指向的位置)
//memmove用於從src拷貝count個位元組到dest,如果目標區域和源區域有重疊的話,
//memmove能夠保證源串在被覆蓋之前將重疊區域的位元組拷貝到目標區域中。
//但複製後src內容會被更改。但是當目標區域與源區域沒有重疊則和memcpy函式功能相同。
#include<stdio.h>
#include<assert.h>
void * my_memmove(void *dest,const void *src, size_t count)
{
	 char *ret = dest;
	 char *p1 = dest;
	 const char *p2 = src;
	 assert(src);
	 assert(dest);
	 if(dest < src)
	 {
	  	while(count--)
	  	{
	   		*p1++ = *p2++;
	  	}
	 }
	 else
	 {
	  	while(count--)
  		{
   			*(p1+count) = *(p2+count);
  		}
 	}
 	return ret;
}
int main()
{
	 char str1[1024] = "abcde";
	 char *str2 = "fghijk";
	 my_memmove(str1+4,str2,5);
	 puts(str1);
	 return 0;
}

相關推薦

[c語言]各種字串函式實現strcpy,strcat,strstr,strchr,strcmp,memcpy,memmove

1.模擬實現strcpy //1.模擬實現strcpy(字串拷貝) #include<stdio.h> #include<assert.h> char * my_strcpy(char *dest,const char *str) {

strcpy strcat strstr strchr strcmp memcpy memmove的自我編譯

  1.實現strcpy  #include<stdio.h> #include<assert.h> char* m_strcpy(char* dest, const char* src) { char *ret = dest; assert(

c語言時間的處理函式和計時的實現

關鍵字:c語言 時間函式 time.h c語言時間函式,時間頭函式 所有程式碼編譯環境:MSVC6.0 1,時間的獲取: 通過time()函式來獲得日曆時間(Calendar Time),其原型為:time_t time(time_t * timer); #incl

C語言字元和字串處理函式(二)strchr,strpbrk,strstr

查詢字元或者字串 查詢一個字元:和和和strchr()。 函式返回一個指向STR中CH首次出現的位置,當沒有在STR中找CH就報道檢視NULL。 查詢任意字元:strpbrk()  函式返回一個指標,它指向字串STR2中任意字元在字串STR1首次出現的位置,如果不存在返

C語言中呼叫靜態函式和動態函式的方式

C語言中呼叫動態庫函式的兩種方式 方式一.隱式呼叫 將動態庫的相關檔案拷貝到當前目錄下(lib、dll),然後新增以下程式碼,在程式中指定連線庫函式。 注意:第二個引數給出的是引入庫檔案(或稱“匯出庫檔案”),而不是dll。在程式執行過程中,lib將dll中需要用到的函式對映到對應的記憶

android的APP呼叫C語言的動態連結實現步驟

1.新建一個類test,通過System.loadLibrary()的方式將so載入進去,注意不要帶有lib 和 so 比如libhello.so,為System.loadLibrary(hello),如下文所示,JAVA 呼叫addtest,返回的Addtest為jn

C語言中處理字串函式

在C語言中有許多字串處理函式,在寫程式的時候常常想不起來或則不瞭解區別,今天就花點時間將這些函式做個總結,以便以後查詢使用。 一、輸入函式 scanf 與 scanf_s 函式 char buf[10] = { 0 }; scanf("%s",

c語言的split字串分割函式strtok的使用

c語言也有類似其他語言的split字串分割函式,就是strtok 標頭檔案:#include <string.h>定義函式:char * strtok(char *s, const char *delim);函式說明:strtok()用來將字串分割成一個個片段。

C語言中常用的函式

C語言中常用的標頭檔案如下: <assert.h> 斷言             <float.h> 浮點數運算 <locale.h> 本土化           <math.h> 數學函式 <signal.h>

C語言中的那些函式(持續更新中)

1.【exit()】        exit是在呼叫處強行退出程式,執行一次程式就結束。exit(0)表示正常退出。exit(1)表示異常退出,這個1是返回給作業系統的。無論是寫在main函式中,還是在其他函式中,都是程式退出。一般都是認為0是正常退出、其他數字是異常退出。所

C語言】 使用回撥函式實現氣泡排序

實現功能:既能排序整型數,也可以排序字串 程式碼如下: #include <stdio.h> #include <string.h> int int_cmp(const v

C語言 呼叫的動態函式重名問題分析

設計兩個動態庫 第一個動態庫:libHelloc: func1.h #ifndef FUNC1_H_ #define FUNC1_H_ int func1(); void func(); #endif func1.c #include "func1.h" int

C語言檔案操作標準函式與Linux系統函式效率比較

我們都知道,C語言在UNIX/Linux系統下有一套系統呼叫(系統函式),比如檔案操作open()、close()、write()、read()等,而標準C語言的庫函式中也有一套對檔案的操作函式fopen()、fclose()、fwrite()、fread()等

C語言中的字串擷取函式及應用

/*======================================================== 子數整數 源程式名 num.??? (pas,c,cpp) 可執行檔名 num.exe 輸入檔名 num.in 輸出檔名 num.out 對於一個五位數a

C語言使用stdlib.h函式的二分查詢和快速排序程式

快速排序: #include <stdlib.h> #include <stdio.h> #include <string.h> #define LENGTH(x) sizeof(x)/sizeof(x[0]) /**輸出陣列元素

c語言==系統呼叫與函式的區別(28)

系統呼叫與庫函式的區別? (1)庫函式是語言或應用程式的一部分,而系統呼叫是核心提供給應用程式的介面,屬於系統的一部分 (2)庫函式在使用者地址空間執行,系統呼叫是在核心地址空間執行,庫函式執行

C 語言兩個動態函式重名問題

應用程式a(a.c),動態庫liba.so(liba.h, liba.c),libb.so,均實現了func() gcc -la -lb a.c 則呼叫的是liba.so中的函式實現 gcc -lb -la a.c 則呼叫的是libb.so中的函式實現

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

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

linux C --深入理解字串處理函式 strlen() strcpy() strcat() strcmp()

    在linux C 程式設計中,我們經常遇到字串的處理,最多的就是字串的長度、拷貝字串、比較字串等;當然現在的C庫中為我們提供了很多字串處理函式。熟練的運用這些函式,可以減少程式設計工作量,這裡介紹幾個常用的字串函式,並編寫一些程式,如果沒有這些庫函式,我們將如何實

深入理解字串處理函式 strlen() strcpy() strcat() strcmp()

在linux C 程式設計中,我們經常遇到字串的處理,最多的就是字串的長度、拷貝字串、比較字串等;當然現在的C庫中為我們提供了很多字串處理函式。熟練的運用這些函式,可以減少程式設計工作量,這裡介紹幾個常用的字串函式,並編寫一些程式,如果沒有這些庫函式,我們將如何實現其功能; 1.求字串長度函式