字串函式和字符函式
- 字符分類函式
- 列子
- 字符轉換函式
- 記憶體函式(重點)
- memcpy
- 用法
- 模擬實作memcpy
- memmove
- 用法
- 模擬memmove函式實作
- memmcmp(記憶體比較)
- 用法
- memset(記憶體設定)
- 用法
字符分類函式
函式 如果他的引數符合下列條件就回傳真
iscntrl 任何控制字符
isspace 空白字符:空格‘ ’,換頁‘\f’,換行’\n’,回車‘\r’,制表符’\t’或者垂直制表符’\v’
isdigit 十進制數字 0~9
isxdigit 十六進制數字,包括所有十進制數字,小寫字母af,大寫字母AF
islower 小寫字母a~z
isupper 大寫字母A~Z
isalpha 字母az或AZ
isalnum 字母或者數字,az,AZ,0~9
ispunct 標點符號,任何不屬于數字或者字母的圖形字符(可列印)
isgraph 任何圖形字符
isprint 任何可列印字符,包括圖形字符和空白字符
列子
1.isdigit
#include<stdio.h>
#include<ctype.h>
int main()
{
char ch = '#';
int ret = isdigit(ch);
printf("%d\n", ret);
return 0;
}

#include<stdio.h>
#include<ctype.h>
int main()
{
char ch = '0';
int ret = isdigit(ch);
printf("%d\n", ret);
return 0;
}

注;isdigit 如果是數字字符回傳非0的值,如果不是數字字符回傳0
2.islower


注:用法與上方isdigit類似
字符轉換函式
1.int tolower ( int c ); 轉小寫
2.int toupper ( int c ); 轉大寫
例子
#include<stdio.h>
#include<ctype.h>
int main()
{
char arr[20] = { 0 };
scanf("%s", arr);
int i = 0;
while (arr[i] != '\0')
{
if (isupper(arr[i]))
{
arr[i] = tolower(arr[i]);
}
printf("%c", arr[i]);
i++;
}
return 0;
}

注:toupper用法與tolower用法類似
記憶體函式(重點)
memcpy
本函式需要呼叫string.h的頭檔案
用法
void * memcpy ( void * destination, const void * source, size_t num );
1.函式memcpy從source的位置開始向后復制num個位元組的資料到destination的記憶體位置,(即destination是復制的,source是被復制的,num是位元組數)
2.這個函式在遇到 ‘\0’ 的時候并不會停下來,
3.如果source和destination有任何的重疊,復制的結果都是未定義的,
#include<string.h>
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[20] = { 0 };
memcpy(arr2, arr1, 20);
return 0;
}

模擬實作memcpy
#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* dst, const void* src, size_t num)
{
void* ret = dst;
assert(dst && src);
while (num--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst + 1;
src = (char*)src + 1;
}
return ret;
}
引例
#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* dst, const void* src, size_t num)
{
void* ret = dst;
assert(dst && src);
while (num--)//4 3 2 1
{
*(char*)dst = *(char*)src;
dst = (char*)dst + 1;
src = (char*)src + 1;
//*(char*)dst++ = *(char*)src++;
}
return ret;
}
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[20] = { 0 };
my_memcpy(arr1+2, arr1, 20);
return 0;
}

決議

注:memcpy函式應該拷貝不重疊的記憶體
memmove
用法
void * memmove ( void * destination, const void * source, size_t num );
1.與memcpy的差別就是memmove函式處理的源記憶體塊和目標記憶體塊是可以重疊的,
2.如果源空間和目標空間出現重疊,就得使用memmove函式處理,
#include<stdio.h>
#include<string.h>
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(arr1+2, arr1, 20);
return 0;
}

注:memcpy-只要實作不重疊拷貝就可以了,而VS中實作即可以拷貝不重疊也可以拷貝重疊記憶體
模擬memmove函式實作
分析

#include<stdio.h>
#include<assert.h>
void* my_memmove(void* dest, const void* source, size_t num)
{
assert(dest && source);
void* ret = dest;
void* r = dest;
void* s = source;
if (dest < source)
{
while (num--)
{
*(char*)dest = *(char*)source;
dest = (char*)dest + 1;
source = (char*)source + 1;
}
return ret;
}
else
{
while (num--)
{
r=(char*)dest + num;
s=(char*)source + num;
*(char*)r = *(char*)s;
//*((char*)dest + num) = *((char*)source + num);
}
return ret;
}
}
memmcmp(記憶體比較)
用法
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
1.比較從ptr1和ptr2指標開始的num個位元組
2.回傳值與strcmp類似
int main()
{
float arr1[] = { 1.0,2.0,3.0,4.0 };
float arr2[] = { 1.0,3.0 };
int ret=memcmp(arr1, arr2, 8);
printf("%d\n", ret);
return 0;
}


memset(記憶體設定)
用法
void * memset ( void * ptr, int value, size_t num );
指的是前ptr所指向的num個位元組的內容設定成指定的value的值
int main()
{
int arr[10] = { 0 };
memset (arr,1,20 );
return 0;
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/287479.html
標籤:其他
上一篇:堆疊的基礎知識(二)
