庫函式strcpy strlen的工作方式

2021-07-06 05:17:45 字數 1622 閱讀 3423

庫函式strcpy的工作方式,如果編寫乙個標準strcpy函式的總分值為10,下面給出幾個不同得分的答案:

2分void strcpy( char *strdest, char *strsrc )

4分void strcpy( char *strdest, const char *strsrc )

//將源字串加const,表明其為輸入引數,加2分

7分void strcpy(char *strdest, const char *strsrc)

10分//為了實現鏈式操作,將目的位址返回,加3分!

char * strcpy( char *strdest, const char *strsrc )

從2分到10分的幾個答案我們可以清楚的看到,小小的strcpy竟然暗藏著這麼多玄機,真不是蓋的!需要多麼紮實的基本功才能寫乙個完美的strcpy啊!

讀者看了不同分值的strcpy版本,應該也可以寫出乙個10分的strlen函式了,完美的版本為:

int strlen( const char *str ) //輸入引數const

return len;

}

strcpy得到了很多面試人員的偏愛,其很大的體現出了c語言基本功.

下面是strcpy原函式

char *strcpy(char *strdest, const char *strsrc);

有幾個問題值得思考並注意:

1.用指標作為形參,在程式開始前應判斷指標變數的合法性,利用斷言assert

2.只作為輸入引數,為了防止被程式設計人員惡意修改,應加入常量宣告const

3.函式返回型別為,char *,其目的是為了方便實現鍊錶表示式.在呼叫函式的過程中已經實現了把

strsrc

的內容複製到

strdest

4.應注意對原始位置的保留.

5.該函式呼叫完成時是遇到'\0'結束符

下面是幾個找錯題:

試題1:

void test1()

試題2:

void test2()

strcpy( string, str1 );

}試題3:

void test3(char* str1)}

試題1字串str1需要11個位元組才能存放下(包括末尾的』\0』),而string只有10個位元組的空間,strcpy會導致陣列越界;從第5條可以看出,函式呼叫完成時已經將'\0'一同賦給了目的位址.

試題2,問題很嚴重,對string[10]陣列的賦值本身沒有錯誤,但很明顯程式期望對string按字串操作,這就需要額外的賦給乙個'\0'結束符;另外如果沒有'\0'結束標誌,呼叫strcpy將不會結束,造成程式的不確定性,很危險.

試題3,一定要注意strlen(pstr),它和strcpy不同,遇到'\0'時結束,但並不計算\0'在內.所以應改為if( strlen( str1 ) <=10 ),另外要注意字串首位址,陣列,各種型別的指標作為形參,都退化為指標.即

void test3(char* str1)

{sizeof(str1)只和編譯器和cpu型別有關,32位cpu為4

strcpy,strlen函式和string原型

編寫strcpy函式 已知strcpy函式的原型是char strcpy char strdest,const char strsrc 其中strdest是目的字串,strsrc是源字串。1 不呼叫c c的字串庫函式,請編寫函式 strcpy 2 strcpy能把strsrc的內容複製到strdes...

構造庫函式

構造靜態庫 構造靜態庫要使用ar 工具 構造方法 gcc c addvec.c multvec.c 生成addvec.o和multvec.o 目標檔案 ar rcs libvector.a addvec.o multvec.o 生成libvector.a 靜態庫 使用靜態庫 可能包含類似libvec...

數學庫函式

blas和lapack是專門為線性代數開發的工具庫。blas英文全稱basic linear algebra subprograms,共有三個層次的計算 向量與向量之間的計算,比如向量的加,減,點乘 向量與矩陣之間的計算,比如乘法運算,一階矩陣和二階矩陣的更新 矩陣與矩陣之間的計算,比如矩陣相乘,k...