[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安全。