庫函式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...