C语言 - strcpy和strncpy的编程实现及总结
一、字符串的strcpy與strncpy函數(shù)
1、編程實(shí)現(xiàn)strcpy函數(shù)(筆試很容易考到)
要求:
原型:char *stpcpy(char *strDest,char *strSrc); ??
頭文件:#include <string.h>
功能:把src所指由NULL結(jié)束的字符串復(fù)制到dest所指的數(shù)組中。
?? 說明:src和dest所指內(nèi)存區(qū)域不可以重疊且dest必須有足夠的空間來容納src的字符串。
返回指向dest結(jié)尾處字符(NULL)的指針。
?
strcpy的代碼實(shí)現(xiàn):
char * strCpy(char * strDest,const char * strSrc) //[1] {//函數(shù)assert的頭文件為#include<assert.h>assert((strDest != NULL)&&(strSrc != NULL)); //[2] char * strDestCopy=strDest; //[3]while ((*strDest++ = *strSrc++) != '\0'); //[4]return strDestCopy; //[5] }
代碼的分析:
代碼[1]:可能會(huì)忘記代碼中的參數(shù)列表以及返回值?
?? 代碼[2]:很多人會(huì)忘記對(duì)字符串指針的檢查,這一部分能體現(xiàn)程序員的嚴(yán)謹(jǐn)性,主要體現(xiàn)在一下三點(diǎn),
a、不檢查指針的有效性,說明答題者不注重代碼的健壯性?
b、檢查指針的有效性時(shí)使用((!strDest)||(!strSrc))或(!(strDest&&strSrc)),說明答題者對(duì)C語言中類型的隱式轉(zhuǎn)換沒有深刻認(rèn)識(shí) ?
c、檢查指針的有效性時(shí)使用((strDest==0)||(strSrc==0)),說明答題者不知道使用常量的好處
代碼2也可以寫:? if ((strDest == NULL)||(strSrc == NULL))
??????????????? throw "Invalid argument(s)"; //throw為拋出異常
代碼[3]: 忘記保存原始的strDest值,說明答題者邏輯思維不嚴(yán)密。
代碼[4]:沒有什么硬性的要求,這部分功能比較容易實(shí)現(xiàn),考慮到邊界問題就可以了
代碼[5]:返回值是為了鏈?zhǔn)秸{(diào)用(一般情況下放回值是字符串類型的指針都是為了鏈?zhǔn)秸{(diào)用)
2、編程實(shí)現(xiàn)strncpy函數(shù)
要求:
原型: ?? char *strncpy(char *strDest, char *strSrc, int n); ? ??
頭文件:#include <string.h>
功能:把src所指由NULL結(jié)束的字符串的前n個(gè)字節(jié)復(fù)制到dest所指的數(shù)組中。
說明:
?? 1、如果src的前n個(gè)字節(jié)不含NULL字符,則結(jié)果不會(huì)以NULL字符結(jié)束。
2、如果src的長(zhǎng)度小于n個(gè)字節(jié),則以NULL填充dest直到復(fù)制完n個(gè)字節(jié)。
3、src和dest所指內(nèi)存區(qū)域不可以重疊且dest必須有足夠的空間來容納src的字符串。
返回值:指向dest的指針。
?
strncpy代碼實(shí)現(xiàn):
char * my_strncpy(char *strDest, const char *strSrc, int num){assert((strDest != NULL) && (strSrc != NULL));//if (strDest == NULL || strSrc == NULL) return NULL;//保存目標(biāo)字符串的首地址char *strDestcopy = strDest;while ((num--)&&(*strDest++ = *strSrc++) != '\0');//如果num大于strSrc的字符個(gè)數(shù),將自動(dòng)補(bǔ)'\0'if (num > 0){while(--num){*strDest++ = '\0';}}return strDestcopy;}
代碼分析:
1、代碼strncpy與代碼strcpy其實(shí)相差不大,
2、需要考慮到,如果src的長(zhǎng)度小于n個(gè)字節(jié),則以NULL填充dest直到復(fù)制完n個(gè)字節(jié)。
轉(zhuǎn)載于:https://www.cnblogs.com/goul/p/9569477.html
總結(jié)
以上是生活随笔為你收集整理的C语言 - strcpy和strncpy的编程实现及总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第五十四篇 Linux相关——远程连接S
- 下一篇: class(一)--类的创建