仿寫C語言string.h頭文件檢驗(yàn)字符串函數(shù)
更新時(shí)間:2021年11月12日 11:58:14 作者:code-016
這里給大家分享的是一個(gè)C語言string.h頭文件檢驗(yàn)字符串函數(shù)的仿寫,非常的簡單實(shí)用,小編覺得這篇文寫的還不錯(cuò),希望能夠給你帶來幫助
c語言string.h頭文件字符串檢驗(yàn)函數(shù)仿寫
所需頭文件:stdio.h ,stdlib.h, string.h
strlen字符串求長度
int strlen_my(const char* src_str)
{
if (NULL == src_str)
{
return -1;
}
const char* p = src_str;
while (*p != '\0')
{
p++;
}
return p - &(src_str[0]);
}
//遞歸
int strlen_my2(const char* src_str)
{
if (src_str == NULL)
return -1;
if (*src_str)
{
return strlen_my2(src_str + 1) + 1;
}
else
{
return 0;
}
}
int main()
{
const char* p = "hello";
printf("%d \n",strlen_my(p));
return 0;
}
strcmp / strncmp字符串比較
int strcmp_my(const char* str_a, const char* str_b)
{
while ((*str_a != '\0' || *str_b != '\0') && *str_a == *str_b )
{
str_a++;
str_b++;
}
return *str_a - *str_b > 0 ? 1 : (*str_a - * str_b < 0 ? -1 : 0);
}
int strcmp_my2(const char* str_a, const char* str_b)
{
int sub = 0;
while ((sub = *str_a - *str_b) == 0 && *str_a++ && *str_b++); //先賦值,指針再++
return sub > 0 ? 1 : (sub < 0 ? -1 : 0);
}
int strncmp_my(const char* str_a, const char* str_b, size_t front_len)
{
while (--front_len && *str_a != '\0' && *str_b != '\0'
&& *str_a == *str_b)
{
str_a++;
str_b++;
}
return *str_a - *str_b > 0 ? 1 : (*str_a - *str_b < 0 ? -1 : 0);
}
int main()
{
const char* p = "hella";
const char* q = "hell";
printf("%d \n", strncmp_my(p, q, 4));
return 0;
}
strchr / strrchr 字符串中查找字符ch
第一個(gè)出現(xiàn)的字符ch
//strchr 返回字符串中第一個(gè)出現(xiàn)的字符ch
char* strchr_my(const char* src_str, char ch)
{
if (src_str == NULL)
{
return NULL;
}
while (*src_str != '\0' && *src_str != ch)
{
src_str++;
}
return *src_str == '\0' ? NULL : src_str;
}
int main()
{
const char* p = "hello";
p = strchr_my(p, 'e');
if (p == NULL)
return 0;
printf("%c\n", *p);
}
最后一個(gè)出現(xiàn)的字符ch
//strrchr查找字符串中最后一個(gè)出現(xiàn)的字母ch
char* strrchr_my(const char* src_str, char ch)
{
if (NULL == src_str) return NULL;
const char* p = src_str + strlen(src_str) - 1;
while ((p - src_str) >= 0 && *p != ch)
{
p--;
}
if (p - src_str == -1)
{
return NULL;
}
return p;
}
int main()
{
const char* p = "hello";
//p = strchr_my(p, 'q');
p = strrchr_my(p, 'l');
if (p == NULL)
return 0;
printf("%c\n", *p);
}
strstr 字符串匹配:src_str中查找des_str,返回匹配的起始位置,沒有為NULL(BF算法)
char* strstr_my(const char* src_str, const char* des_str)
{
if (NULL == src_str || NULL == des_str)
{
return NULL;
}
int len_src = strlen(src_str);
int len_des = strlen(des_str);
int i = 0; //src_str
int j = 0; //des_str
while (i < len_src && j < len_des)
{
if (src_str[i] == des_str[j])
{
i++;
j++;
}
else
{
i = i - j + 1;
j = 0;
}
}
if (j == len_des)
{
return src_str + i - j;
}
return NULL;
}
int main()
{
const char* p = "hello";
const char* q = "llo";
const char* rt = strstr_my(p, q);
if (rt != NULL)
{
printf("%s\n", rt);
return 0;
}
return 0;
}
strcpy / strncpy字符串拷貝
char* strcpy_my(char* des_str, const char* src_str)
{
if (des_str == NULL || src_str == NULL)
return NULL;
char* p = des_str;
while (*src_str != '\0')
{
*p++ = *src_str++;
}
*p = '\0';
return des_str;
}
char* strncpy_my(char* des_str, const char* src_str, size_t len)
{
if (des_str == NULL || src_str == NULL || len <= 0)
return NULL;
char* p = des_str;
//源字符串實(shí)際長度
int cur_len = strlen(src_str) <= len ? len : strlen(src_str);
while (cur_len--)
{
*p++ = *src_str++;
}
*p = '\0';
return des_str;
}
int main()
{
const char* p = "hello";
char q[10] = {0};
if (strncpy_my(q, p, 1) != NULL)
{
printf("%s\n", q);
}
return 0;
}
strcat / strncat字符串的粘貼
char* strcat_my(char* des_str, const char* src_str)
{
if (des_str == NULL || src_str == NULL)
return NULL;
int len_des = strlen(des_str);
char* p = des_str + len_des;
while (*src_str != '\0')
{
*p++ = *src_str++;
}
return des_str;
}
char* strncat_my(char* des_str, const char* src_str, size_t len)
{
if (des_str == NULL || src_str == NULL || len < 0)
return NULL;
int len_des = strlen(des_str);
char* p = des_str + len_des;
while (len--)
{
*p++ = *src_str++;
}
return des_str;
}
int main()
{
char p[20] = "hello";
const char* q = "world";
printf("p = %s\n", p);
printf("q = %s\n", q);
if (strncat_my(p, q, 3) != NULL)
{
printf("p = %s\n", p);
}
printf("q = %s\n", q);
return 0;
}
strdup 字符串申請堆區(qū)空間存放字符串的副本
char* strdup_my(const char* src_str)
{
if (NULL == src_str)
return NULL;
char* newspace = (char*)malloc((strlen(src_str) + 1 ) * sizeof(char));
if (newspace == NULL)
return NULL;
int i = 0;
while (*src_str != '\0')
{
newspace[i++] = *src_str++;
}
newspace[i] = '\0';
return newspace;
}
int main()
{
const char* p = "hello";
char* q = strdup_my(p);
if (q != NULL)
{
printf("%s\n", q);
free(q);
q == NULL;
}
return 0;
}
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C++算法設(shè)計(jì)之馬踏棋盤的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了C++算法設(shè)計(jì)之馬踏棋盤的實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
VS報(bào)錯(cuò)C6011的問題:取消對NULL指針的引用(解決方法)
這篇文章主要介紹了VS報(bào)錯(cuò)C6011的問題:取消對NULL指針的引用(解決方法),C6011:取消對NULL指針的引用,發(fā)現(xiàn)是沒有進(jìn)行空指針的判斷,解決方案跟隨小編一起看看吧2024-01-01
C++實(shí)現(xiàn)LeetCode(118.楊輝三角)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(118.楊輝三角),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
成員初始化列表與構(gòu)造函數(shù)體中的區(qū)別詳細(xì)解析
無論是在構(gòu)造函數(shù)初始化列表中初始化成員,還是在構(gòu)造函數(shù)體中對它們賦值,最終結(jié)果是相同的。不同之處在于,使用構(gòu)造函數(shù)初始化列表的版本初始化數(shù)據(jù)成員,沒有定義初始化列表的構(gòu)造函數(shù)版本在構(gòu)造函數(shù)體中對數(shù)據(jù)成員賦值2013-09-09
OpenCV基于背景減除實(shí)現(xiàn)行人計(jì)數(shù)
本文主要介紹了如何使用OpenCV C++對視頻中的人流量進(jìn)行統(tǒng)計(jì)。文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)OpenCV有一定的幫助,需要的可以了解一下2022-01-01
VisualStudio2019解決scanf函數(shù)報(bào)錯(cuò)問題
在 Visual Studio 2019 編輯代碼時(shí),前期剛剛接觸到VS編譯器時(shí)存在的困惑,當(dāng)用scanf()函數(shù),進(jìn)行輸入時(shí),在運(yùn)行的時(shí)候編譯器會(huì)出現(xiàn)警告報(bào)錯(cuò),本文就來介紹一下解決方法2023-08-08
C++如何獲取當(dāng)前系統(tǒng)時(shí)間及格式化輸出
這篇文章主要介紹了C++如何獲取當(dāng)前系統(tǒng)時(shí)間及格式化輸出的實(shí)例代碼,主要用到time()及strftime()函數(shù),通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02

