目錄
創(chuàng)新互聯(lián)建站一直秉承“誠(chéng)信做人,踏實(shí)做事”的原則,不欺瞞客戶(hù),是我們最起碼的底線(xiàn)! 以服務(wù)為基礎(chǔ),以質(zhì)量求生存,以技術(shù)求發(fā)展,成交一個(gè)客戶(hù)多一個(gè)朋友!為您提供成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、成都網(wǎng)頁(yè)設(shè)計(jì)、微信小程序開(kāi)發(fā)、成都網(wǎng)站開(kāi)發(fā)、成都網(wǎng)站制作、成都軟件開(kāi)發(fā)、重慶App定制開(kāi)發(fā)是成都本地專(zhuān)業(yè)的網(wǎng)站建設(shè)和網(wǎng)站設(shè)計(jì)公司,等你一起來(lái)見(jiàn)證!求字符串長(zhǎng)度
頭文件
strlen - 計(jì)算字符串長(zhǎng)度
函數(shù)聲明
strlen 函數(shù)模擬
PS.strlen計(jì)算出來(lái)的為無(wú)符號(hào)數(shù),兩個(gè)無(wú)符號(hào)數(shù)進(jìn)行運(yùn)算恒為正
長(zhǎng)度不受限制的字符串函數(shù)
頭文件
PS.此類(lèi)函數(shù)只關(guān)注 '\0',使用時(shí)可能會(huì)越界訪(fǎng)問(wèn)
strcpy - 字符串拷貝
函數(shù)聲明
strcpy 函數(shù)模擬
strcat - 字符串追加
函數(shù)聲明
strcat 發(fā)生C4996錯(cuò)誤解決
strcat 函數(shù)模擬
strcmp - 字符串比較
函數(shù)聲明
strcmp 函數(shù)模擬
長(zhǎng)度受限制的字符串函數(shù)
頭文件
strncpy - 字符串拷貝
函數(shù)聲明
strncat - 字符串追加
函數(shù)聲明
strncmp - 字符串比較
函數(shù)聲明
查找字符串
頭文件
strstr - 查找字符串
函數(shù)聲明
PS.NULL/null - 空指針? ? ? ? NUL/Null - '\0'
strstr 函數(shù)模擬
strtok - 拆解字符串
函數(shù)聲明
字符串報(bào)錯(cuò)
頭文件
strerror - 錯(cuò)誤報(bào)告
函數(shù)聲明
字符分類(lèi)函數(shù)
頭文件
字符轉(zhuǎn)換函數(shù)
頭文件
內(nèi)存函數(shù)
頭文件
memcpy - 拷貝函數(shù)
函數(shù)聲明
memcpy 函數(shù)模擬(不包括內(nèi)存重疊的情況)
memmove - 處理重疊拷貝函數(shù)
函數(shù)聲明
memmove 函數(shù)模擬
memcmp - 比較函數(shù)
函數(shù)聲明
memset - 內(nèi)存設(shè)置函數(shù)
函數(shù)聲明
#include
strlen - 計(jì)算字符串長(zhǎng)度
函數(shù)聲明size_t strlen (const char* str); //size_t == unsigned int
字符串以 '\0' 作為結(jié)束標(biāo)志,strlen 函數(shù)返回的是在字符串中?'\0' 前面出現(xiàn)的字符個(gè)數(shù)
參數(shù)指向的字符串要以?'\0' 結(jié)束
#includeint main()
{
char arr[] = { 'a','b','c' };
//在后面加入'\0'時(shí),就不會(huì)計(jì)算成隨機(jī)值了
//即:{ 'a','b','c','\0' }
int len = strlen(arr);
printf("%d", len);
return 0;
}
strlen 函數(shù)模擬指針
#include#include
unsigned int strlen_s(char* str)
{ //此處 unsigned int 是符合原函數(shù)聲明
//寫(xiě)為 int 也可以
int count = 0;
assert(str != NULL);
while (*str != '\0')
{
count++;
str++;
}
return count;
}
遞歸
#includeint my_strlen(char* str)
{
if (*str != '\0')
{
return 1 + strlen_s(str + 1);
}
else
{
return 0;
}
}
PS.strlen計(jì)算出來(lái)的為無(wú)符號(hào)數(shù),兩個(gè)無(wú)符號(hào)數(shù)進(jìn)行運(yùn)算恒為正
長(zhǎng)度不受限制的字符串函數(shù)
頭文件#include
PS.此類(lèi)函數(shù)只關(guān)注 '\0',使用時(shí)可能會(huì)越界訪(fǎng)問(wèn)
strcpy - 字符串拷貝
函數(shù)聲明char* strcpy(char* destination, const char* source);
destination - 目標(biāo)數(shù)組
source - 起始數(shù)組
源字符串中必須要以 '\0' 結(jié)束
目標(biāo)字符串空間要足夠大
目標(biāo)空間大小要可修改
#include#includeint main()
{
char arr1[] = "abcdefg";
char arr2[] = "yes";
strcpy(arr1, arr2);
//拷貝的時(shí)候 '\0' 也會(huì)拷貝過(guò)去
return 0;
}
strcpy 函數(shù)模擬#include#include
char* my_strcpy(char* dest, const char* src)
{
assert(dest != NULL);
assert(src != NULL);
char* ret = dest;
//拷貝 src 指向的字符串到 dest
while (*dest++ = *src++)
{
;
}
//返回目的空間的起始地址
return ret;
}
strcat - 字符串追加
函數(shù)聲明char* strcat(char* destination, const char* source);
追加字符串時(shí)是從第一個(gè) '\0' 開(kāi)始,源字符串中的?'\0' 也會(huì)追加過(guò)去
目標(biāo)空間要足夠大,能容納下源字符串的內(nèi)容
目標(biāo)空間必須可以修改
字符串自己給自己追加時(shí)會(huì)出錯(cuò),程序崩潰?
#include#includeint main()
{
char ch1[20] = "Hello";
char ch2[] = "World";
strcat(ch1, ch2);
printf("%s\n", ch1);
return 0;
}
strcat 發(fā)生C4996錯(cuò)誤解決方法一:項(xiàng)目右鍵 - 屬性 - C/C++ - 預(yù)處理器 - 預(yù)處理器定義 - 編輯,加上
?????_CRT_SECURE_NO_DEPRECATE
方法二:在程序最前面加上
????#define _CRT_SECURE_NO_WARNINGS
strcat 函數(shù)模擬#include#include
char* my_strcat(char* dest, const char* src)
{
assert(dest != NULL);
assert(src != NULL);
//兩行代碼可縮寫(xiě)為 assert(dest && src);
char* ret = dest;
while (*dest != '\0')
{
dest++;
}
while (*dest++ = *src++)
{
; //追加時(shí)的代碼和 strcpy 一樣
}
return ret;
}
strcmp - 字符串比較
函數(shù)聲明int strcmp(const char* str1, const char* str2);
str1 >str2,返回值 >0
str1 = str2,返回值?= 0
str1
比較首字符大小(根據(jù)ASCII碼表比較),而非字符串長(zhǎng)度
當(dāng)首字符相等時(shí),比較第二位字符,以此類(lèi)推
#include#includeint main()
{
char* p1 = "abc";
char* p2 = "xyz";
int a = strcmp(p1, p2);
printf("%d\n", a);
return 0; //打印 -1
}
strcmp 函數(shù)模擬#include#include
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
}
if (*str1 >*str2)
return 1;
else
return -1;
}
#include#include
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
}
return (*str1 - *str2);
}
長(zhǎng)度受限制的字符串函數(shù)
頭文件#include
strncpy - 字符串拷貝
函數(shù)聲明char* strncpy(char* destination, const char* source, size_t count);
strncat - 字符串追加 函數(shù)聲明count - 拷貝的字節(jié)數(shù) - 單位為字節(jié)
count 數(shù)字如果大于 source 字符個(gè)數(shù),不足就補(bǔ) '\0'
char* strcat(char* destination, const char* source, size_t count);
strncmp - 字符串比較 函數(shù)聲明count - 追加的字節(jié)數(shù) - 單位為字節(jié)
int strcmp(const char* str1, const char* str2, size_t count);
查找字符串 頭文件count - 比較的字節(jié)數(shù) - 單位為字節(jié)
如 count =?3,則各自比較前3個(gè)字符
#include
strstr - 查找字符串
函數(shù)聲明char* strstr(const char *haystack, const char *needle);
haystack - 要被檢索的字符串
needle?-?在 haystack 字符串內(nèi)要搜索的小字符串
該函數(shù)返回在 haystack 中第一次出現(xiàn) needle 字符串的位置,如果未找到則返回NULL - 空指針
打印時(shí) %p - 找到返回地址,未找到返回NULL
? %s - 找到返回需要找的字符串及之后的字符串,未找到返回NULL
PS.NULL/null - 空指針? ? ? ? NUL/Null - '\0' strstr 函數(shù)模擬#include#include
char* my_strstr(const char* p1, const char* p2)
{
assert(p1 && p2);
char* s1, * s2;
char* start = p1;
//p1 為 const char* 類(lèi)型,而 start 為 char* 類(lèi)型
//此處可將 p1 強(qiáng)制類(lèi)型轉(zhuǎn)換為 char* 類(lèi)型
while (*start)
{
s1 = start;
s2 = p2;
while ((*s1 != '\0') && (*s2 != '\0') && (*s1 == *s2))
{
s1++;
s2++;
}
if (*s2 == '\0')
return start;
if (*s1 == '\0')
return NULL;
start++;
}
return NULL;
}
strtok - 拆解字符串
函數(shù)聲明char* strtok(char *str, const char *delim);
str?-?要被分解成一組小字符串的字符串
delim?-?包含分隔符的字符串??
該函數(shù)返回被分解的第一個(gè)子字符串,如果沒(méi)有可檢索的字符串,則返回一個(gè)NULL - 空指針
strtok 函數(shù)會(huì)拷貝一份源字符串,對(duì)拷貝的字符串進(jìn)行拆解?
#include#includeint main()
{
char arr[] = "StarDustShakeHand@hotmail.com";
const char* ch = "@.";
char* ret;
for (ret = strtok(arr, ch); ret != NULL; )
{
printf("%s\n", ret);
ret = strtok(NULL, ch);
}
return 0;
}
字符串報(bào)錯(cuò)
頭文件#include
strerror - 錯(cuò)誤報(bào)告
函數(shù)聲明char* strerror(int errnum);
輸入錯(cuò)誤碼,返回錯(cuò)誤信息
#include#includeint main()
{
char* str = strerror(0);
printf("%s\n", str);
//打印 No error
return 0;
}
#include#includeint main()
{
char* str = strerror(1);
printf("%s\n", str);
//打印 Operation not permitted
return 0;
}
錯(cuò)誤碼輸入 errno,errno是一個(gè)全局的錯(cuò)誤碼變量,當(dāng)C語(yǔ)言庫(kù)函數(shù)在執(zhí)行過(guò)程中發(fā)生了錯(cuò)誤,就會(huì)把對(duì)應(yīng)的錯(cuò)誤碼賦值到 errno 中
字符分類(lèi)函數(shù) 頭文件#include
函數(shù) | 參數(shù)滿(mǎn)足以下條件則返回真 |
iscntrl | 任何控制字符 |
isspace | 空白字符:空格;換頁(yè)'\f';換行'\n';回車(chē)'\r',制表符'\t';垂直制表符'\v' |
isdigit | 十進(jìn)制數(shù) 0 ~ 9 |
isxdigit | 十六進(jìn)制數(shù) 0 ~ 9;A ~ F;a ~ f |
islower | 小寫(xiě)字母 a ~ z |
isupper | 大寫(xiě)字母 A ~ Z |
isalpha | 小寫(xiě)或大寫(xiě)字母 |
isalnum | 字母或十進(jìn)制數(shù)字 |
ispunct | 標(biāo)點(diǎn)符號(hào),可打印的不屬于數(shù)字或字母的圖形字符 |
isgraph | 任何圖形字符 |
isprint | 任何可打印的字符(包括圖形、空白字符 |
#include
函數(shù) | 用處 |
tolower | 將小寫(xiě)字符轉(zhuǎn)為大寫(xiě)字符 |
toupper | 將大寫(xiě)字符轉(zhuǎn)為小寫(xiě)字符 |
#include//或者
#include
作用范圍比字符串函數(shù)大,任何類(lèi)型的數(shù)據(jù)都能操作
memcpy - 拷貝函數(shù) 函數(shù)聲明void* memcpy(void* destination, const void* source, size_t num);
memcpy 處理內(nèi)存不重疊的情況就行
memmove 要可以處理內(nèi)存重疊的情況?
#include#includeint main()
{
int arr1[] = { 1,2,3,4,5 };
int arr2[5] = { 0 };
memcpy(arr2, arr1, sizeof(arr1));
return 0;
}
#include#includestruct Stu
{
char name[20];
int age;
};
int main()
{
struct Stu arr1[] = { {"小明",18},{"小紅",19},{"小剛",20} };
struct Stu arr2[3] = { 0 };
memcpy(arr2, arr1, sizeof(arr1));
return 0;
}
memcpy 函數(shù)模擬(不包括內(nèi)存重疊的情況)#include#include
void* my_memcpy(void* dest, const void* src, size_t num)
{
assert(dest && src);
char* ret = dest;
while (num--)
*((char*)dest)++ = *((char*)src)++;
return ret;
} //dest 會(huì)改變,最好還是 void* ret
memmove - 處理重疊拷貝函數(shù)
函數(shù)聲明void* memmove(void* destination, const void* source, size_t num);
可處理內(nèi)存重疊的情況
memmove 函數(shù)模擬#include#include
void* my_memmove(void* dest, const void* src, size_t num)
{
assert(dest && src);
void* ret = dest;
if (dest< src)
{
while (num--)
*((char*)dest)++ = *((char*)src)++;
}
else
{
while (num--)
*((char*)dest + num) = *((char*)src + num);
}
return ret;
} //dest 會(huì)改變,最好還是 void* ret
memcmp - 比較函數(shù)
函數(shù)聲明int memcmp(const void* ptr1, const void* ptr2, size_t num);
比較從 ptr1 和 ptr2 指針開(kāi)始的 num 個(gè)字節(jié),比出大小時(shí)就停止
ptr1 >ptr2,返回值 >0
ptr1 = ptr2,返回值?= 0
ptr1< ptr2,返回值0
#include#includeint main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[] = { 1,3,2,4,5,6,7,8,9,10 };
int a = memcmp(arr1, arr2, 5);
//a< 0
return 0;
}
memset - 內(nèi)存設(shè)置函數(shù)
函數(shù)聲明void* memset(void* str, int c, size_t n);
str?-?指向要填充的內(nèi)存塊
c?-?要被設(shè)置的值。該值以 int 形式傳遞,但在函數(shù)中時(shí)是使用該值的無(wú)符號(hào)字符形式
n?-?要被設(shè)置為該值的字符數(shù) - 單位為字節(jié)
#include#includeint main()
{
char arr[10] = "";
memset(arr, '#', 10);
return 0;
}
#include#includeint main()
{
int arr[10] = { 0 };
memset(arr, 1, sizeof(arr));
//元素都變?yōu)?16843009,memset 是一個(gè)字節(jié)一個(gè)字節(jié)地改
return 0;
}
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧