最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解C語(yǔ)言的mem系列函數(shù)

 更新時(shí)間:2022年02月14日 14:44:31   作者:roseisbule  
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言的mem系列函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

1.memchr

memchr的函數(shù)聲明:

void *memchr(const void *str, int c, size_t n);

作用:

 memchr函數(shù)從str位置后的n個(gè)位置開始尋找,尋找第一個(gè)和c相同的字符。如果成功,memchr函數(shù)返回一個(gè)指向該字符位置的指針,如果沒有沒有找到指定字符,則返回NULL。

實(shí)例:

#include <stdio.h>
#include <string.h>
int main()
{
	const char* a = "my blog";
	if (memchr(a, 'g', 7) != NULL)
		printf("g is found\n");
	if (memchr(a, 'g', 2) != NULL)
		printf("g is found\n");
	return 0;
}

函數(shù)的實(shí)現(xiàn):

?void* my_memchr(const char* str,int c,size_t n)
{
	assert(str != NULL);
	while ((n--) && (*(str++) - c));
	if (!(*str - c))
		return NULL;
	return str;
}

注意事項(xiàng):形參中的c是一個(gè)無符號(hào)字符。

2.memcmp

函數(shù)的聲明:

int memcmp( const void *buf1, const void *buf2, size_t count );

作用:

memcmp用于比較buf1 和 buf2 的前count個(gè)字節(jié)進(jìn)行比較,如果buf1大于buf2,該函數(shù)返回一個(gè)正數(shù),如果小于則返回一個(gè)負(fù)數(shù),相等則返回0。

實(shí)例:

#include <stdio.h>
#include <string.h>
 
int main()
{
    char str1[15];
    char str2[15];
    int ret;
    memcpy(str1, "aBcDDDD", 8);
    memcpy(str2, "aBCdddd", 8);
    ret = memcmp(str1, str2, 7);
    printf("%s ", str1);
    if (ret > 0)
        printf("大于");
    else if (ret < 0)
        printf("小于");
    else
        printf("等于");
    printf(" %s\n", str2);
    return 0;
}

函數(shù)的實(shí)現(xiàn):

首先我們需要了解memcmp是怎么比較大小的。通過不斷地調(diào)整上面實(shí)例的兩個(gè)字符串,我發(fā)現(xiàn),該函數(shù)是從第一個(gè)字節(jié)開始比較,如果相同,則繼續(xù)比較下一個(gè)字節(jié),如果有大小差異,則將這兩個(gè)字節(jié)的大小差異作為結(jié)果輸出。

int my_memcmp(const void* buf1,const void *buf2,size_t count)
{
    assert(buf1 && buf2);
    while ((count--) && !(*(((char*)buf1)++) - *(((char*)buf2)++)));
    return *(--(char*)buf1) - *(--(char*)buf2);//這里要 -- 是因?yàn)樯厦娴淖詈筮€++了一下
}

3.memcpy

函數(shù)的聲明:

void *memcpy( void *dest, const void *src, size_t count );

作用:

該函數(shù)將 src 的 count 個(gè)字節(jié)復(fù)制到 dest。該函數(shù)返回 dest 的起始位置。

實(shí)例:

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[50] = { 0 };
	char* b = "csdn.com";
	memcpy(arr, b, strlen(b));
	printf("%s", arr);
	return 0;
}

函數(shù)的實(shí)現(xiàn):

void* my_memcpy(void* a, const void* b, size_t count)
{
	assert(a && b);
	void* ret = a;
	while (count--)
	{
		*(char*)a = *(char*)b;
		a = (char*)a + 1;
		b = (char*)b + 1;
	}
	return ret;
}

4.memmove

函數(shù)聲明:

void *memmove( void *dest, const void *src, size_t count );

作用:

該函數(shù)的作用和memcpy類似。但是為什么會(huì)有memmove呢?

我們看下面這段代碼

#include <stdio.h>
#include <string.h>
 
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	memcpy(arr + 3, arr, 7);
	int i = 0;
	for (i = 0; i < 10; i++)
		printf("%d ", arr[i]);
	return 0;
}

我們可能認(rèn)為答案是 1 2 3 1 2 3 4 5 6 7

但是vs2022給出的結(jié)果是

這是因?yàn)?,?nèi)存只有一塊,可能會(huì)沖突 。比如 4  這個(gè)位置,一開始 4 被修改為 1 ,再后來,當(dāng)dest指針指到這個(gè)1的時(shí)候,他又會(huì)把這個(gè)1放到后面的位置。而memmove就能解決這個(gè)問題。

它是如何解決的呢?

對(duì)于剛才這種情況,我們發(fā)現(xiàn) dest(紅) 大于 src(藍(lán)),如果我們從左開始,往右開始修改,那么肯定會(huì)出現(xiàn)剛才那種情況,但是如果是從右往左呢?  思考后我們發(fā)現(xiàn),這是可行的,就好像右邊的人在追左邊的人,然后左邊的人不斷地往后丟東西,都丟在右邊的人的身上。同時(shí),我們發(fā)現(xiàn),如果src(藍(lán))的最右端超過了dest(紅)的最右端,這種方法好像又不適用了,也不能再?gòu)挠彝罅恕?/p>

我們知道 ,dest和src的大小應(yīng)該都是count,所以不存在上面這種情況。

那就可以開始具體實(shí)現(xiàn)了。

void* my_memmove(void* a,const void* b,size_t count) //a:dest b:source
{
	assert(a && b);
	void* ret = a;
	//s<d 從右往左
	if (b < a)
	{
		a = (char*)a + count - 1;
		b = (char*)b + count - 1;
		while (count--)
		{
			*(char*)a = *(char*)b;
			a = (char*)a - 1;
			b = (char*)b - 1;
		}
	}
	else
	{
		while (count--)
		{
			*(char*)a = *(char*)b;
			a = (char*)a + 1;
			b = (char*)b + 1;
		}
	}
	return ret;
}

5.memset

函數(shù)聲明:

void *memset( void *dest, int c, size_t count );

作用:就是可以初始化一塊內(nèi)存為具體值。

實(shí)例:

#include <stdio.h>
#include <string.h>
 
int main()
{
	char p[20] = "what is csdn";
	memset(p, '#', 4);
	printf("%s", p);
	return 0;
}

函數(shù)實(shí)現(xiàn):

void* my_memset(void* dest, int c, size_t count)
{
	void* tmp = dest;
	while (count--)
		*(((char*)dest)++) = (char)c;
	return tmp;
}

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!     

相關(guān)文章

  • C語(yǔ)言如何改變字體顏色

    C語(yǔ)言如何改變字體顏色

    這篇文章主要介紹了C語(yǔ)言如何改變字體顏色,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • C++中memset函數(shù)用法詳解

    C++中memset函數(shù)用法詳解

    這篇文章主要介紹了C++中memset函數(shù)用法,結(jié)合實(shí)例形式詳細(xì)分析了memset函數(shù)的功能、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2016-06-06
  • C++中priority_queue與仿函數(shù)實(shí)現(xiàn)方法

    C++中priority_queue與仿函數(shù)實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于C++中priority_queue與仿函數(shù)實(shí)現(xiàn)的相關(guān)資料,優(yōu)先級(jí)隊(duì)列是一種容器適配器,其底層通常采用vector容器,并通過堆算法來維護(hù)元素的順序,文中通過代碼介紹的非常詳細(xì)《》需要的朋友可以參考下
    2024-10-10
  • C++ template用法案例詳解

    C++ template用法案例詳解

    這篇文章主要介紹了C++ template用法案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • C++中友元的詳解及其作用介紹

    C++中友元的詳解及其作用介紹

    這篇文章主要介紹了C++中友元的詳解及其作用介紹,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • C語(yǔ)言 結(jié)構(gòu)體和指針詳解及簡(jiǎn)單示例

    C語(yǔ)言 結(jié)構(gòu)體和指針詳解及簡(jiǎn)單示例

    本文主要介紹C語(yǔ)言 結(jié)構(gòu)體和指針,這里整理了相關(guān)資料,并附示例代碼和實(shí)現(xiàn)結(jié)果,以便大家學(xué)習(xí)參考,希望能幫助學(xué)習(xí)C語(yǔ)言的朋友
    2016-08-08
  • C語(yǔ)言實(shí)現(xiàn)隨機(jī)抽獎(jiǎng)程序

    C語(yǔ)言實(shí)現(xiàn)隨機(jī)抽獎(jiǎng)程序

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)隨機(jī)抽獎(jiǎng)程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C++中const關(guān)鍵字的用法圖文詳解

    C++中const關(guān)鍵字的用法圖文詳解

    在C++中const是一個(gè)關(guān)鍵字,用于聲明常量,它可以用于多種情況,包括聲明常量變量、常量指針、以及成員函數(shù)中的常量性,這篇文章主要給大家介紹了關(guān)于C++中const關(guān)鍵字用法的相關(guān)資料,需要的朋友可以參考下
    2024-08-08
  • 淺談c++中的stl中的map用法詳解

    淺談c++中的stl中的map用法詳解

    下面小編就為大家?guī)硪黄獪\談c++中的stl中的map用法詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-10-10
  • 使用C語(yǔ)言來解決循環(huán)隊(duì)列問題的方法

    使用C語(yǔ)言來解決循環(huán)隊(duì)列問題的方法

    這篇文章主要介紹了使用C語(yǔ)言來解決循環(huán)隊(duì)列問題的方法,來自ACM的練習(xí)題實(shí)例,需要的朋友可以參考下
    2015-08-08

最新評(píng)論

襄樊市| 商都县| 韩城市| 美姑县| 当阳市| 阿勒泰市| 奈曼旗| 莱阳市| 襄垣县| 巴南区| 石阡县| 蓬莱市| 城口县| 略阳县| 普格县| 云和县| 淅川县| 张家港市| 五原县| 营山县| 镇平县| 夹江县| 漳平市| 阿巴嘎旗| 海原县| 济南市| 章丘市| 伊吾县| 平顺县| 古浪县| 吴忠市| 内丘县| 冕宁县| 洛川县| 枣庄市| 中宁县| 宝山区| 丰县| 舒兰市| 铅山县| 北安市|