字符串處理函數的一些問題

[1] strcpy函數的問題

對於兩個char[ ]: char destination[N],char source[M],

如果source的長度大於destination的長度,那麼實際上在內存中,source中的字符已經全部存儲到以destination爲起始的內存中了。

所以實際上strcpy函數是不安全的,相比之下使用可以限制拷貝位數的strncpy函數更加安全。

實例:

char source[]="givenaveryveryveryverylonglonglongchar";
char destination[3];
strcpy(destination,source);//結果就是source被destination中溢出的部分覆蓋!

更加具體的原因則設計初始化變量時的內存分配。

先創建的變量分配一個高地址,後創建的變量則分配一個低地址。而且這些變量在內存區域大體上是連續的。

所以就會出現上面所說的覆蓋現象。如果使用不慎就會覆蓋掉其他變量


[2] strcat

同樣的內存問題也會出現在strcat上面。

添加在末尾的字符串實際上已經放到了內存中,會出現覆蓋變量的現象。


[3] strstr()函數

char *strstr( const char *str1, const char *str2 );

函數返回一個指針,指向str2首次出現於 str1中的位置。(相關知識:KMP算法

如果沒有找到則返回NULL


[4]strchr()函數

char *strchr( const char *str, char ch );
和strstr返回值一樣,都是一個指針代表ch首次出現的位置。

差別在於此函數查找一個字符而strstr查找一個字串。

[5]strncpy、strncmp、strncat

函數原型均如下。

str_function( const char *str1, const char *str2, size_t count );
添加了一個參數用來限定操作的位數,比沒有參數的cpy\cmp\cat安全。

發佈了49 篇原創文章 · 獲贊 6 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章