C語言實(shí)現(xiàn)字符串操作函數(shù)的實(shí)例
C語言實(shí)現(xiàn)字符串操作函數(shù)的實(shí)例
在編寫程序的過程中,我們經(jīng)常使用到一些字符串函數(shù),例如求字符串長度,拷貝字符串……,這些函數(shù)都在C標(biāo)準(zhǔn)庫中存在,我們可以直接使用。但我們還需要掌握這些函數(shù)的實(shí)現(xiàn)方法,今天來看看一些常用的字符串操作函數(shù)的實(shí)現(xiàn)方法。
1.strlen
strlen是用來求字符串長度的函數(shù),字符串長度就是它所包含的字符個(gè)數(shù)。
今天給大家介紹三種實(shí)現(xiàn)strlen函數(shù)的方法
(1)定義一個(gè)計(jì)數(shù)器count
//方式一:定義一個(gè)計(jì)數(shù)器
size_t my_strlen(const char *str)
{
int count = 0;
while (*str)
{
count++;
str++;
}
return count;
}
(2)遞歸實(shí)現(xiàn)
size_t my_strlen(const char *str)
{
if (*str == '\0')
return 0;
else
return my_strlen(str + 1) + 1;
}
(3)利用指針-指針
size_t my_strlen(const char *str)
{
const char *end = str;
while (*end++)
{
;
}
return end - str - 1;
}
2.strcpy
用于復(fù)制字符串的函數(shù)是strcpy,它的原型如下:
char *strcpy(char *dest, const char *src);
使用這個(gè)函數(shù)時(shí),要注意幾點(diǎn)
(1)、目標(biāo)字符數(shù)組的空間必須足夠大,足以容納需要復(fù)制的字符串
(2)、目標(biāo)字符數(shù)組要可以被修改
(3)、被復(fù)制的字符串要可以找到'\0'
char *my_strcpy(char *dest, const char *src)
{
char *tmp = dest;
assert(dest);
assert(src);
while (*dest++ = *src++)
{
;
}
return tmp;
}
3.strcat
strcat函數(shù)是可以把一個(gè)字符串添加(連接)到另一個(gè)字符串的后面。strcat函數(shù)要求dest參數(shù)原先已經(jīng)包含了一個(gè)字符串(可以是空字符串)。它找到這個(gè)字符串的末尾,并把src字符串的一份拷貝添加到這個(gè)位置。
char *my_strcat(char *dest, const char *src)
{
char *ret = dest;
assert(dest);
assert(src);
while (*dest != '\0')
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return ret;
}
4.strcmp
strcmp用于比較兩個(gè)字符串,及對(duì)兩個(gè)字符串對(duì)應(yīng)的字符逐個(gè)進(jìn)行比較,直到發(fā)現(xiàn)不匹配。那個(gè)最先不匹配的字符中較“小”的那個(gè)字符所在的字符串被認(rèn)為“小于”另外一個(gè)字符串。如果其中一個(gè)字符串是另外一個(gè)字符串的前面一部分,那么它也被認(rèn)為“小于”另外一個(gè)字符串,因?yàn)樗?\0'出現(xiàn)的更早。需要注意的是,strcmp函數(shù)對(duì)于只包含大寫字母或只包含小寫字母的字符串比較。
int my_strcmp(const char *src1, const char *src2)
{
while (*src1 == *src2)
{
if (*src1 == '\0')
return 0;
src1++;
src2++;
}
return *src1 - *src2;
}
5.strstr
為了在一個(gè)字符串中查找一個(gè)子串,可以使用strstr函數(shù),該函數(shù)實(shí)在s1中查找整個(gè)s2第1次出現(xiàn)的起始位置,并返回一個(gè)指向該位置的指針。如果s2并沒有出現(xiàn)在s1的任何地方,函數(shù)將返回一個(gè)NULL指針。如果第二個(gè)函數(shù)是一個(gè)空字符串,函數(shù)就返回s1。
char *my_strstr(const char* s1, const char* s2)
{
const char *p = s1;
const char *q = s2;
const char *cur = NULL;
assert(s1);
assert(s2);
if (*s2 == '\0')
return s1;
while (*p)
{
cur = p;
while ((*p) && (*q) && (*p == *q))
{
p++;
q++;
}
if (*q == '\0')
return cur;
p = cur + 1;
q = s2;
}
return NULL;
}
6.strchr
strchr是用來查找一個(gè)特定的字符,在字符串str中查找字符ch第一次出現(xiàn)的位置,找到后函數(shù)返回一個(gè)指向該位置的指針。如果該字符并不存在于字符串中,函數(shù)就返回一個(gè)NULL指針。
char *my_strchr(char const *str, int ch)
{
const char *tmp = str;
while (*tmp)
{
if (*tmp == ch)
{
return tmp;
}
tmp++;
}
return NULL;
}
7.strrchr
與strchr類似的查找函數(shù)還有一個(gè)是strrchr,它和strchr的不同之處在于,該函數(shù)返回的是一個(gè)指向字符串中該字符最后一次出現(xiàn)的位置
char* my_strrchr(const char* str, int ch)
{
char* pos = 0;
assert(str);
while (*str)
{
if (*str == ch)
{
pos = str;
}
str++;
}
if (pos != 0)
{
return pos;
}
else
return NULL;
}
長度受限制的字符串函數(shù)
標(biāo)準(zhǔn)庫中還包含一些函數(shù),它們以一種不同的方式去處理字符串。這些函數(shù)接受一個(gè)顯示的長度參數(shù),用于限定進(jìn)行復(fù)制或比較的字符數(shù)。
1.strncpy
和strcpy一樣,strncpy把源字符串的字符復(fù)制到目標(biāo)空間,但是,它總是正好向dest中拷貝len個(gè)字符,如果strlen(src)的值小于len,dest數(shù)組就用額外的'\0'填充到len字節(jié)長度。如果strlen(src)的值大于或等于len,那么只有l(wèi)en個(gè)字符被復(fù)制到dest中。
char *my_strncpy(char *dest, const char *src, size_t len)
{
char *ret = dest;
size_t i = 0;
assert(dest);
assert(src);
while (len--)
{
*ret++ = *src++;
}
if (*(ret) != '\0')
{
*ret = '\0';
}
return dest;
}
2.strncat
strncat,它從src中最多復(fù)制len個(gè)字符到目標(biāo)數(shù)組的后面。
char *my_strncat(char *dst, const char *src, size_t len)
{
char *ret = dst;
assert(dst);
assert(src);
while (*dst != '\0')
{
dst++;
}
while (len--)
{
*dst = *src;
dst++;
src++;
}
return ret;
}
3.strncmp
strncmp也用于比較兩個(gè)字符串,但它最多比較len個(gè)字節(jié)。如果兩個(gè)字符串在第len個(gè)字符之前存在不相等的字符,這個(gè)函數(shù)就像strcmp一樣停止比較,返回結(jié)果。如果兩個(gè)字符串的前l(fā)en個(gè)字符相等,函數(shù)就返回零。
int my_strncmp(char const *s1, char const *s2, size_t len)
{
assert(s1);
assert(s2);
while (len--)
{
if (*s1 == *s2)
{
s1++;
s2++;
}
else
{
return *s1 - *s2;
}
}
return 0;
}
標(biāo)準(zhǔn)庫里的字符串函數(shù)還有很多,今天就先介紹到這里。
以上就是C語言字符串的操作總結(jié) ,如有疑問,請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
學(xué)習(xí)二維動(dòng)態(tài)數(shù)組指針做矩陣運(yùn)算的方法
這片文章介紹了如何利用二維動(dòng)態(tài)數(shù)組指針做矩陣運(yùn)算,需要的朋友可以參考下2015-07-07
C語言編程中借助pthreads庫進(jìn)行多線程編程的示例
這篇文章主要介紹了C語言編程中借助pthreads庫進(jìn)行多線程編程的示例,文中的示例環(huán)境為Windows系統(tǒng),需要的朋友可以參考下2015-11-11
基于QT制作一個(gè)TCPServer與TCPClient的通信
這篇文章主要為大家詳細(xì)介紹了如何基于QT制作一個(gè)TCPServer與TCPClient的通信,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12
C++詳細(xì)講解互斥量與lock_guard類模板及死鎖
線程的主要優(yōu)勢在于,能夠通過全局變量來共享信息。不過,這種便捷的共享是有代價(jià)的:必須確保多個(gè)線程不會(huì)同時(shí)修改同一變量,或者某一線程不會(huì)讀取正由其他線程修改的變量。為了防止出現(xiàn)線程某甲試圖訪 問一共享變量時(shí),線程某乙正在對(duì)其進(jìn)行修改。引入了互斥量2022-07-07
C++?IO設(shè)備讀寫功能實(shí)現(xiàn)詳解
C++的文件IO(Input,Output)操作就是指對(duì)文件進(jìn)行讀寫(輸入與輸出)的操作。輸入就是從磁盤上的文件中讀取內(nèi)容到內(nèi)存中。輸出就是將內(nèi)存中的數(shù)據(jù)內(nèi)容輸出或者說寫入到磁盤的文件中,這篇文章主要介紹了C++?IO設(shè)備讀寫功能實(shí)現(xiàn)2022-11-11

