C語言中的字串處理函式

2021-09-16 11:56:59 字數 3941 閱讀 2870

1、strcpy():複製字串(不安全)

2、strncpy():複製n個字串(安全)

3、strcat():連線字串(不安全)

4、strncat():連線n個字串(安全)

5、strcmp():字串比較,c語言中字串比較不能用=

6、strlen():字串長度

7、strset():字串重置

9、memset():記憶體重置

10、memcpy():記憶體複製(不安全)

11、memmove():記憶體複製(安全)

12、strstr():字串中查詢字串函式,若找到返回位置,否則返回null

13、strchr():字串中查詢字元的函式,若找到返回位置,否則返回null

14、strtok():分解字串為一組字串,使用方法如下

注意:當src串長度》dest串長度時,程式仍會將整個src串複製到dest區域,可是dest陣列已發生溢位。因此會導致dest棧空間溢位以致產生崩潰異常。當達到最大尺寸時,它只是停止複製字元。

char* mystrcpy(char* pre, const char* next)

if (pre == next) // 兩者相等也無需拷貝了

return pre;

while ((*pre++ = *next++) != '\0'); // 依次賦值給主字元陣列

return out;

}

上面程式實現了strcpy的程式,實現很簡單依次賦值給朱字元陣列即可,當遇到next指向字串結束字元』\0』後,完成賦值並且停止賦值。這樣新賦值的』\0』就成了字元陣列表示的字串結尾符,哪怕主字串pre比next長也會戛然而止。字串判斷不管字元陣列存了啥,它只認到』\0』前的數是它的主體核心部分。strcpy沒有檢查長度會溢位,推薦使用strncpy

說明:如果n > dest串長度,dest棧空間溢位。否則:

1)src串長度<=dest串長度,(這裡的串長度包含串尾null字元)

如果n=(0, src串長度),src的前n個字元複製到dest中。但是由於沒有null字元,所以直接訪問dest串會發生棧溢位的異常情況。

如果n = src串長度,與strcpy一致。

如果n = dest串長度,[0,src串長度]處存放src字串,(src串長度, dest串長度]處存放null。

2)src串長度》dest串長度

如果n =dest串長度,則dest串沒有null字元,會導致輸出會有亂碼。

char *strncpy(char *strdest , const char *strsrc , int n)

strcat函式常見的錯誤就是陣列越界,即兩個字串連線後,長度超過第乙個字串陣列定義的長度,導致越界。

char* mystrcat(char* pre, const char* next)

由於strcat也容易造成緩衝區溢位,因此推薦使用strncat.

strncat把src所指向的字元的前n個字元新增到dest結尾處(覆蓋原dest結尾處的'\0'),並新增新的'\0'。src和dest所指記憶體區域不可以重疊,並且dest必須有足夠的空間來容納src的前n個字串,返回指向dest的指標。

char *strncat(char *dest,const char *str,int n)

return dest;

}

由於這四個函式都可能造成緩衝區溢位,在vs2015中已經禁用這幾個函式。

strcmp函式是c/c++中基本的函式,它對兩個字串進行比較,然後返回比較結果,函式形式為:int strcmp(const char* str1, const char* str2)。其中str1和str2可以是字串常量或者字串變數,返回值為整形。返回結果如下規定:

① str1小於str2,返回負值或者-1(vc返回-1);                  

② str1等於str2,返回0;

③ str1大於str2,返回正值或者1(vc返回1);

strcmp函式實際上是對字元的ascii碼進行比較,實現原理如下:首先比較兩個串的第乙個字元,若不相等,則停止比較並得出兩個ascii碼大小比較的結果;如果相等就接著 比較第二個字元然後第三個字元等等。無論兩個字串是什麼樣,strcmp函式最多比較到其中乙個字串遇到結束符'/0'為止,就能得出結果。**實現如下(參考):

int strcmp(const char* str1, const char* str2)

if (ret < 0)

else if(ret > 0)

return 0;

}

strlen()用於計算字元陣列長度,到字串結束符』\0』即停止。如:

char nzarr = "abcdef";

int nlen = strlen(nzarr); //結果為6,並不是100,和分配陣列記憶體大小無關,不包含'/0'

int nlen = sizeof(nzarr); //結果為7,包括'/0'

strset()用於設定字元陣列全為某一字元,如果存在『\0』結束符,遇結束符停止賦值。

char nzarr[100]="abcd";

strset(nzarr,'g'); //nzarr結果為「gggg」,如果未初始化,則100個空間都為'g'

memset()與strset()類似,賦值字元陣列指定字元,但可以指定個數。

char nzarr[100]="abcd";

memset(nzarr,'g',sizeof(nzarr)); //nzarr中全為g,該函式是空間操作,不遇'\0'停止,輸出g後會出現亂碼

memcpy()由src指向位址為起始位址的連續n個位元組的資料複製到以destin指向位址為起始位址的空間內。 

函式實現:

void* memcpy(void* dest, const void* src, size_t n)

strcpy和memcpy主要有以下3方面的區別。

#include#includeint main()

輸出結果:goldenglobal view

memcpy與memmove的目的都是將n個位元組的源記憶體位址的內容拷貝到目標記憶體位址中。但當源記憶體和目標記憶體存在重疊時,memcpy會出現錯誤,而memmove能正確地實施拷貝,但這也增加了一點點開銷。memmove的處理措施:

函式實現:

void* memmove(void* dest, const void* src, size_t n)

else if (sstrstr()和strchr()都是查詢第二個引數第一次出現在第乙個字元陣列的位置,前者是查詢字元陣列,而後者是字元。但是注意返回,返回的是引數出現的位址,需要賦給char*指標來儲存,而不是乙個索引。 

#include #include int main ()

return(0);

}

參考:

C語言中處理字串的函式

在c語言中有許多字串處理函式,在寫程式的時候常常想不起來或則不了解區別,今天就花點時間將這些函式做個總結,以便以後查詢使用。char buf 10 scanf s buf 輸入 tttt3 printf buf s n buf 結果 buf tttt3 char buf1 10 scanf s s ...

C語言中的字串處理函式

strcasecmp 1,函式原型 int strcasecmp const char str1,const char str2 2,功能 比較str1和str2是否相等,忽略大小寫的差異 3,標頭檔案 include 4,返回值 str1 str2 返回0 str1 str2 返回大於0的值 st...

c語言中常字串處理的函式

為了更加的熟悉字串操作的函式,所以把相應的函式積累如下 1 sprintf 函式 把格式化的資料寫入某個字串 sprintf函式現在用的最多的就是用來各種型別轉換成字串的應用。標頭檔案 stdio.h 函式原型 int sprintf char buffer,const char format,ar...