欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言模擬實(shí)現(xiàn)庫(kù)函數(shù)詳解

 更新時(shí)間:2022年07月13日 10:51:53   作者:BaconZzz  
C語(yǔ)言庫(kù)函數(shù)是把自定義函數(shù)放到庫(kù)里,是別人把一些常用到的函數(shù)編完放到一個(gè)文件里,供程序員使用,下面讓我們一起來詳細(xì)了解它

前言

庫(kù)函數(shù)的模擬,看似多此一舉,實(shí)則汲取精華。

1.字符串函數(shù)

1.1字符串控制函數(shù)

1.1.1 strlen的模擬

求字符串長(zhǎng)度

//--------------------------------------
size_t strlen( const char *string );
//--------------------------------------
//返回值用 int / size_t 各有好處
int MyStrlen(const char* str)
{
	assert(str);
	int cnt = 0;
	while (*str != '\0')
	{
		str++;
		cnt++;
	}
	return cnt;
}
int main()
{
	char arr[] = "bacon";
	printf("%d\n", MyStrlen(arr));
	return 0;
}

1.1.2 str(n)cpy的模擬

拷貝字符串

//-------------------------------------
char* strcpy(char* dest, const char* src)
//-------------------------------------
char* MyStrcpy(char* dest, const char* src)
{
	assert(dest && src);
	char* ret = dest;
	while (*dest++ = *src++);
	return ret;
}
int main()
{
	char str1[30] = "Bacon";
	char str2[] = " is your friend.";
	MyStrcpy(str1 + 5, str2);
	printf("%s\n", str1);
	return 0;
}
//Bacon is your friend.
//------------------------------------------------------------
char* strcpy(char* dest, const char* src, size_t num)
//---------------------------------------------------------------
char* MyStrncpy(char* dest, const char* src, size_t num)
{
	assert(dest && src);
	char* ret = dest;
	while (num--)
	{
		*dest++ = *src++;
	}
	return ret;
}
int main()
{
	char str1[20] = { 0 };
	char str2[] = "bacon";
	printf("%s\n", MyStrncpy(str1, str2, 4));
	return 0;
}
//baco

Bacon is your friend.

baco

1.1.3 str(n)cmp的模擬

逐個(gè)比較字符串中的字符

//-----------------------------------------------
int strcmp(const char* str1, const char* str2)
//-----------------------------------------------
int MyStrcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1 != '\0' && *str2 != '\0' && *str1 == *str2)
	{
		str1++;
		str2++;
	}
	if (*str1 == *str2)
		return 0;
	else if (*str1 > *str2)
		return 1;
	else
		return -1;
}
int main()
{
	char str1[] = "abcdef";
	char str2[] = "abcdfe";
	printf("%d\n", MyStrcmp(str1, str2));
	return 0;
}
//-1
//-----------------------------------------------------
int strncmp(const char* str1, const char* str2, size_t num)
//---------------------------------------------------------
int MyStrncmp(const char* str1, const char* str1, size_t num)
{
	assert(dest && src);
	while (num--)
	{
		if (*str1!= *str2)
		{
			if (*str1> *str2)
				return 1;
			else
				return -1;
		}
		str1++;
		str2++;
	}
	return 0;
}
int main()
{
	char str1[] = "abcdef";
	char str2[] = "abcdfe";
	printf("%d\n", MyStrncmp(str1, str2, 5));
	return 0;
}

-1

1.1.4 str(n)cat的模擬

字符串追加

//----------------------------------------------
char* strcat(char* dest, const chat* src)
//----------------------------------------------
char* MyStrcat(char* dest, const char* src)
{
	assert(dest && src);
	char* ret = dest;
	//找到字符串結(jié)尾
	while (*dest != '\0')
	{
		dest++;
	}
	while (*dest++ = *src++);
	return ret;
}
int main()
{
	char str1[20] = "bacon";
	char str2[] = " king";
	printf("%s\n", MyStrcat(str1 , str2));
	return 0;
}
//bacon king
//----------------------------------------------------------
char* strncat(char* dest, const char* src, size_t num);
//----------------------------------------------------------
char* MyStrncat(char* dest, const char* src, size_t num)
{
	assert(dest && src);
	char* ret = dest;
	while(*dest != '\0')
	{
		dest++;
	}
	while (num--)
	{
		*dest++ = *src++;
	}
	return ret;
}
int main()
{
	char str1[30] = "Bacon";
	char str2[] = " is your friend";
	printf("%s\n", MyStrncat(str1, str2, 8));
	return 0;
}
//Bacon is your

bacon king

Bacon is your

1.1.5 strstr的模擬

查找子串

//------------------------------------------------
char* strstr(const char* str1, const char* str2)
//--------------------------------------------------
char* MyStrstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	char* p = str1;
	char* s1 = str1;
	char* s2 = str2;
	while (*p)//str1走完就可以跳出了
	{
		//找到可能匹配的位置
		while (*s1 != *s2)
		{
			s1++;
		}
		p = s1;
		while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return p;
		}
		else
		{
			s1 = p + 1;
			s2 = str2;
			p = s1;
		}
	}
	return NULL;
}
int main()
{
	char str1[] = "abbbcdef";
	char str2[] = "bbc";
	printf("%s\n", MyStrstr(str1, str2));
	return 0;
}

1.1.6 strtok的使用

切分字符串:根據(jù)給定的分隔符,把分隔符置 ‘\0’ ,并保存當(dāng)前位置(存在靜態(tài)區(qū))

傳 非NULL : 從當(dāng)前位置開始strtok傳 NULL : 從上次保存的位置開始strtok

比較奇怪的函數(shù),此處僅示范使用方法

//---------------------------------------------
char* strtok(char* str , const char* sep)
//---------------------------------------------
//由函數(shù)定義:我們需要多次切分的時(shí)候——第一次傳字符串地址,之后傳NULL
int main()
{
	char* p = "SiDiuPiDe233@icloud.com";
	char sep[] = "@.";
	char arr[30];
	strcpy(arr, p);
	char* i = NULL;
	for (i = strtok(arr, sep); i != NULL; i = strtok(NULL, sep))
	{
		printf("%s\n", i);
	}
	return 0;
}

SiDiuPiDe
icloud
com

1.1.7 strerror的使用

打印錯(cuò)誤碼對(duì)應(yīng)的信息

在C語(yǔ)言中設(shè)置了一個(gè) 名為 “errno” 的全局變量,來保存錯(cuò)誤碼(不同運(yùn)行錯(cuò)誤的編號(hào))

//---------------------------------
char* strerror(int errnum);
//-----------------------------------
int main()
{
	FILE* p = fopen("test.txt", "r");
	if (NULL == p)
		printf("%s\n", strerror(errno));
	return 0;
}

No such file or directory

1.2 字符串分類函數(shù)和字符串轉(zhuǎn)換函數(shù)

函數(shù)說明
iscntrl任何控制字符
isspace空白字符:空格‘ ’,換頁(yè)‘\f’,換行’\n’,回車‘\r’,制表符’\t’或者垂直制表符’\v’
isdigit十進(jìn)制數(shù)字 0~9
isxdigit十六進(jìn)制數(shù)字,包括所有十進(jìn)制數(shù)字,小寫字母a~f,大寫字母A~F
islower小寫字母a~z
isupper大寫字母A~Z
isalpha字母a~z或A~Z
isalnum字母或者數(shù)字,az,AZ,0~9
ispunct標(biāo)點(diǎn)符號(hào),任何不屬于數(shù)字或者字母的圖形字符(可打印)
isgraph任何圖形字符
isprint任何可打印字符,包括圖形字符和空白字符

如果他的參數(shù)符合下列條件就返回真

汲?。?/p>

指針使用前 assert

用const保護(hù)不需要修改的數(shù)據(jù)

對(duì)于while中的指針的加減需要留心 while(*dest1++)while(*dest2) { dest2++; }

  • dest1跳出循環(huán)后是野指針
  • dest2跳出循環(huán)后指向’\0’

到此這篇關(guān)于C語(yǔ)言模擬實(shí)現(xiàn)庫(kù)函數(shù)詳解的文章就介紹到這了,更多相關(guān)C語(yǔ)言庫(kù)函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一篇文章帶你了解C++語(yǔ)法基礎(chǔ)--字符串

    一篇文章帶你了解C++語(yǔ)法基礎(chǔ)--字符串

    這篇文章主要介紹了C++常用字符串分割方法實(shí)例匯總,包括了strtok函數(shù)、STL、Boost等常用的各類字符串分割方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2021-08-08
  • C語(yǔ)言深入探究選擇排序與基數(shù)排序使用案例講解

    C語(yǔ)言深入探究選擇排序與基數(shù)排序使用案例講解

    算法中排序是十分重要的,而每一個(gè)學(xué)習(xí)計(jì)算機(jī)的都會(huì)在初期的時(shí)候接觸到這種排序,下面這篇文章主要給大家介紹了關(guān)于c語(yǔ)言選擇排序與基數(shù)排序使用的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • C語(yǔ)言實(shí)現(xiàn)時(shí)間處理工具的示例代碼

    C語(yǔ)言實(shí)現(xiàn)時(shí)間處理工具的示例代碼

    這篇文章主要為大家詳細(xì)介紹了利用C語(yǔ)言實(shí)現(xiàn)時(shí)間處理工具的相關(guān)資料,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下
    2022-09-09
  • VS?Code安裝及C、C++環(huán)境配置詳細(xì)教程(Windows系統(tǒng))

    VS?Code安裝及C、C++環(huán)境配置詳細(xì)教程(Windows系統(tǒng))

    這篇文章主要介紹了VS?Code安裝及C、C++環(huán)境配置詳細(xì)教程(Windows系統(tǒng)),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • C/C++語(yǔ)言中的頭文件匯總

    C/C++語(yǔ)言中的頭文件匯總

    這篇文章主要匯總了C/C++語(yǔ)言中的頭文件,方便各位朋友更好的工作和學(xué)習(xí),有需要的朋友可以參考下
    2020-06-06
  • OpenCV實(shí)現(xiàn)多圖像拼接成一張大圖

    OpenCV實(shí)現(xiàn)多圖像拼接成一張大圖

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)多圖像拼接成一張大圖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Matlab繪制雨云圖的方法詳解

    Matlab繪制雨云圖的方法詳解

    這篇文章主要介紹了如何利用Matlab實(shí)現(xiàn)雨云圖的繪制,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定的幫助,需要的可以參考一下
    2022-05-05
  • C++中nullptr 和 NULL 的區(qū)別及用法

    C++中nullptr 和 NULL 的區(qū)別及用法

    nullptr是常數(shù),nullptr_t是它的類型.在需要分別使用空指針或空指針類型的上下文中使用每一個(gè).今天通過本文給大家介紹C++ nullptr 和 NULL 的使用區(qū)別,需要的朋友參考下吧
    2021-07-07
  • C中的volatile使用方法

    C中的volatile使用方法

    volatile 影響編譯器編譯的結(jié)果,指出,volatile 變量是隨時(shí)可能發(fā)生變化的,與volatile變量有關(guān)的運(yùn)算,不要進(jìn)行編譯優(yōu)化,以免出錯(cuò)
    2013-02-02
  • 使用devenv在命令行中編譯項(xiàng)目的方法

    使用devenv在命令行中編譯項(xiàng)目的方法

    下面小編就為大家分享一篇使用devenv在命令行中編譯項(xiàng)目的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01

最新評(píng)論