字串函式的實現(筆記)

2021-10-09 09:54:32 字數 3722 閱讀 8146

c語言字串函式

c語言字串函式在函式原型為string.h的標頭檔案中,編寫程式時直接呼叫即可

strlen

size_t strlen(char const *s)//作為引數,陣列和指標形式一樣,在這裡用指標表達

返回s的字串長度(不包括結尾的0)const作用是strlen保證不會修改當前的內容

strlen編寫

#include

#include

//字串標頭檔案

intmylen

(const

char

*s)//定義乙個自己的字串長度函式

return num;

//返回結果

}int

main

(int argc,

char

*agrv)

strcmp

strcpy

strstr

strcat

strchr

strcpy

char *strcpy(char restrict dst, const char restrict src)

把src字串拷貝到字串dst空間中去,restrict表示src和dst所佔記憶體空間不重疊,返回dst為了讓dst參與其他運算,投入給其他函式的引數

重疊時不能利用strcpy進行複製,不重疊時可進行複製計算

第乙個引數是目的,第二個引數是源,源要求不能被改變,加const,而目的不需要

通常利用此函式進行字串的複製

char dst = (char)malloc(strlen(src)+1);

//src是源字串,但是源字串可能不會實時存在,例如當乙個函式引數需要字串作為輸入,此時函式得到的是字串的首個位置的位址,其他值並沒有被函式得到,而src作為輸入,第一次被賦值"hello",當下一次賦值行為產生後可能被改變成為"world",但是運算需要第一次賦值參與(這樣就使得不能保證函式引數所指向的那個位址儲存的字串實時存在),為了能夠實現,需要向系統申請另一塊空間進行儲存,但是因為得到的是位址,並沒有說明字串具體的大小,這塊記憶體的大小未知,所以利用動態記憶體分配解決,將src字串複製到另乙個變數儲存(相當於複製到我這裡儲存),並將此變數作為函式進行輸入。strlen(src)+1,加一是因為strlen只得到了字串的有效長度,即存內容的長度,不包括結尾的0,+1是為了在dst裡面也以字串的形式儲存,+1後得到的空間包含了結尾的0,結尾的0利用strcpy函式裡面加入,使dst成為字串

strcpy(dst, src);//接著做strcpy

寫自己的strcpy(最簡單的,不分配到多個核裡面)

#include

#include

char

*mycpy1

(char

*dst,

const

char

* src)

//陣列版本

dst[idx]

='\0'

;//跳出後,在迴圈外面加入最後一位

return dst;

//返回下標

}char

*mycpy2

(char

*dst,

const

char

* src)

//指標版本

*dst =

'\0'

;return ret;

/*上述賦值運算可直接寫到while中,while(*dst++ = *src++);剩下空迴圈

為了讓**更簡潔,但是執行效率是一樣的,迴圈內部無任何內容即可

*/}intmain

(int agrc,

char

const

*agrv)

strcmp函式(compare)比較時不修改字串

/*strcmp 比較兩個陣列的大小是否相等

返回結果有-1 1 0(具體返回結果根據編譯器不同而不同,具體是0,大於0,小於0三種情況)

不可以用兩個陣列 s1 和 s2直接比較

s1 == s2 這個時候比較的是兩個陣列位址是否相同,沒有任何意義,陣列的比較永遠是false

if( strcmp(s1, s2) == 0 ) 比較兩個字串是否相等的寫法

strcmp()其中引數是兩個固定的引數

*/

#include

#include

char

mycmp1

(char

const s1,

char

const s2)

//第一種,利用while迴圈,條件判斷

else

if( s1[idx]

=='\0'

) idx++;}

return s1[idx]

- s2[idx];}

char

mycmp2

(char

const

*s1,

char

const

*s2 )

//第二種,省略中間判斷

else if ( s1[idx] == '\0' )

idx++;}

return s1[idx]

- s2[idx];}

char

myc***

(char

const

*s1,

char

const

*s2 )

//第三種,省略中間部分的變數,直接將陣列看做指標,取位址後,對位址變數以及相對應數值進行操作

else if ( s1[idx] == '\0' )

// idx++;

}return

*s1 -

*s2;

}int

main

(int agrc,

char

const

*agrv)

字串搜尋函式

char *strchr(const char *s, int c);

char *strrchr(const char *s, int c);

返回null表示沒有找到

#include

#include

#include

/*char* strchr(const char *s, int c); 從左向右在字串中找到此字元出現的第乙個位置

char* strrchr(const char *s, int c); 從右向左在字串中找到此字元出現的第乙個位置

返回null表示沒有,非null表示出現的第乙個指標

返回值是指標,型別為char型

*/int

main

(int argc,

char

const

*ar**)

字串中尋找字串

char * strstr(const char *s1, const char * s2);

字串中尋找乙個字串

char * strcasestr(const char *s1, const char * s2);

字串中尋找字串,忽略大小寫

字串函式實現

本文介紹了strcpy,strcnpy,atoi,itoa,strcmp,strncmp,字串逆置的c語言實現 比較簡單,或許存在bug 1.strcpy,strncpy 2.字串的逆置 void reverse char s q 這個時候q是指向 0 的,所以需要往前移動一下 while q p ...

字串函式實現

1.memmove void memmove void dest,const void src,size t count memmove用於從source拷貝count個字元到dest,如果目標區域和源區域有重疊的話,memmove能夠保證在源串覆蓋之前將重疊區域的位元組拷貝到目標區域中 void ...

字串函式的實現

字串函式實現 ps 1.字元 null 0 表示ascii 碼為0 的字元 null 空字元 2.char s1 nizaye char s2 opzayebb s1 s2 s1 s2 s1 s2 執行會出現錯誤,char s1 nizaye 相當與 const char s1 nizaye 定義了...