柚子快報激活碼778899分享:【C語言】內(nèi)存函數(shù)詳細講解
柚子快報激活碼778899分享:【C語言】內(nèi)存函數(shù)詳細講解
文章目錄
前言strerror的聲明和使用字符串分類函數(shù)字符轉(zhuǎn)換函數(shù)內(nèi)存拷貝函數(shù)(memcpy)memcpy的聲明和使用memcpy函數(shù)的模擬實現(xiàn)
內(nèi)存拷貝函數(shù)(memmove)memmove的聲明和使用memmove模擬實現(xiàn)
內(nèi)存比較函數(shù)(memcmp)memcmp的聲明和使用
內(nèi)存設(shè)置函數(shù)(memset)memset的使用
最后
前言
前面我們學(xué)習(xí)了字符串函數(shù),但字符串函數(shù)只能對字符串進行操作,但在C語言中有很多的數(shù)據(jù)類型,所以本章講解一些內(nèi)存函數(shù),這些函數(shù)可以對任何數(shù)據(jù)類型進行拷貝、追加、比較。
strerror的聲明和使用
char * strerror ( int errnum );
獲取指向錯誤消息字符串的指針。解釋錯誤碼(errnum)所對應(yīng)的錯誤信息。必須包含頭文件errno.hstrerror 生成的錯誤字符串可能特定于每個系統(tǒng)和庫實現(xiàn)。
在vs2022編譯編譯器下的運行結(jié)果
字符串分類函數(shù)
函數(shù)如果他的參數(shù)符合下列條件就返回真iscntrl任何控制字符isspace空白字符:空格‘ ’,換頁‘\f’,換行’\n’,回車‘\r’,制表符’\t’或者垂直制表符’\v’isdigit十進制數(shù)字 0~9isxdigit十六進制數(shù)字,包括所有十進制數(shù)字,小寫字母a-f,大寫字母A-Fislower小寫字母a~zisupper大寫字母A~Zisalpha字母a-z或A-Zisalnum字母或者數(shù)字,a-z,A-Z,0-9ispunct標(biāo)點符號,任何不屬于數(shù)字或者字母的圖形字符(可打?。﹊sgraph任何圖形字符isprint任何可打印字符,包括圖形字符和空白字符
這些函數(shù)都很簡單根據(jù)意思使用就行,下面簡單用幾個。
// 字符串分類函數(shù)使用
int main()
{
//檢查是否為小寫字符
if (islower('c'))
{
printf("是小寫字符");
}
return 0;
}
字符轉(zhuǎn)換函數(shù)
int tolower ( int c ); // 將大寫轉(zhuǎn)化小寫 int toupper ( int c );//將小寫轉(zhuǎn)化為大寫
//tolower的使用
int main()
{
char arr[] = { "Hello WoRD" };
for (int i = 0; i < sizeof(arr); i++)
{
//大寫轉(zhuǎn)化為小寫
arr[i]=tolower(arr[i]);
}
printf("%s", arr);
return 0;
}
toupper的使用,是一樣的,這里就不展示了,讀者可以自己嘗試一下。
內(nèi)存拷貝函數(shù)(memcpy)
memcpy的聲明和使用
void * memcpy ( void * destination, const void * source, size_t num );
函數(shù)memcpy從source的位置開始向后復(fù)制num個字節(jié)的數(shù)據(jù)到destination的內(nèi)存位置。這個函數(shù)在遇到 ‘\0’ 的時候并不會停下來。如果source和destination有任何的重疊,復(fù)制的結(jié)果都是未定義的。
使用
//memcpy的拷貝整形使用
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8 };
int arr1[15];
memcpy(arr1, arr, sizeof(arr));
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
memcpy函數(shù)的模擬實現(xiàn)
//memcpy模擬實現(xiàn)
void* my_memcpy(void* des, const void* sour, size_t num)
{
//
assert(des && sour);
while (num)
{
*(char*)des = *(char*)sour;
++(char*)des;
++(char*)sour;
num--;
}
}
內(nèi)存拷貝函數(shù)(memmove)
memmove的聲明和使用
void * memmove ( void * destination, const void * source, size_t num );
和memcpy的差別就是memmove函數(shù)處理的源內(nèi)存塊和目標(biāo)內(nèi)存塊是可以重疊的。如果源空間和目標(biāo)空間出現(xiàn)重疊,就得使用memmove函數(shù)處理。 使用
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8 };
memmove(arr, arr + 2, 16);
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
printf("%d ", arr[i]);
}
return 0;
}
memmove模擬實現(xiàn)
有重疊部分時
當(dāng)des小于sour的地址時從前向后拷貝。當(dāng)des大于sour的地址時從后向前拷貝
沒重疊部分時
從前向后拷貝、從后向前拷貝都可以。
void* my_memmove(void* des, const void* sour, size_t num)
{
assert(des&& sour);
void* ret = des;
//從前向后拷貝
if (des < sour)
{
while (num)
{
*(char*)des = *(char*)sour;
++(char*)des;
++(char*)sour;
num--;
}
return ret;
}
//從后向前拷貝
while (num--)
{
*((char*)des + num) = *((char*)sour + num);
}
return ret;
}
內(nèi)存比較函數(shù)(memcmp)
memcmp的聲明和使用
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
比較從ptr1和ptr2指針開始的num個字節(jié)請注意,與 strcmp 不同,該函數(shù)在找到 null 字符后不會停止比較。返回值如下: 使用
int main ()
{
char buffer1[] = "DWgaOtP12df0";
char buffer2[] = "DWGAOTP12DF0";
int n;
n=memcmp ( buffer1, buffer2, sizeof(buffer1) );
if (n>0)
printf ("'%s' is greater than '%s'.\n",buffer1,buffer2);
else if (n<0)
printf ("'%s' is less than '%s'.\n",buffer1,buffer2);
else
printf ("'%s' is the same as '%s'.\n",buffer1,buffer2);
return 0;
}
內(nèi)存設(shè)置函數(shù)(memset)
memset的使用
void * memset ( void * ptr, int value, size_t num );
把ptr指向的前num個字節(jié)的空間設(shè)置成value的值。
int main()
{
char arr[] = { "hello word" };
memset(arr, 'x', 5);
printf("%s", arr);
}
最后
感謝大家的觀看, 大家可以在評論區(qū)留言,你們的支持就是我最大的動力。
柚子快報激活碼778899分享:【C語言】內(nèi)存函數(shù)詳細講解
相關(guān)文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。