【C言語】文字列--strcpy関数の解答とその分析

2390 ワード

新浪微博waterbaby~小窝~Juliaから、本人は一部の赤い部分を修正しました
 
cにおけるstrcpy関数のプロトタイプ
既知strcpy関数のプロトタイプは
char* strcpy(char* strDest,const char* strSrc);
1.ライブラリ関数を呼び出さずstrcpy関数を実現
2.なぜchar*に戻るのかを説明する.
1.strcpy     
char* strcpy(char* strDest,const char* strSrc)
{
if((strDest == NULL) || (strSrc == NULL)) //[1]
throw "Invalid Arguments"; //[2]
char* strDestCopy = strDest; //[3]
while((*strDest++ = *strSrc++) != '\0')//[4]
//               ,                 。           : strSrc        strDest     ,    ,  

//strDest      ‘\0’, strSrc  ,strDest  ,         ,  strDest     '\0'.
return strDestCopy;
}

 
[1](A)ポインタの有効性をチェックせず、設計者がプログラムの頑丈性(B)ポインタの有効性をチェックしないことを説明するときに使用(((!strDest)‖(!strSrc))または(!(strDest&&strSrc))を用いて、C言語について説明する
タイプ暗黙変換は深く認識されていないが、この例ではchar*がboolに変換されるのはタイプ暗黙変換であり、この機能は柔軟であるが、しかし、エラー確率の増大とメンテナンスコストの増大(!strDestはstrDest!=nullを表し、最初に割り当てられたポインタは野ポインタであり、決して空ではなく、正反対を想定している)(C)ポインタの有効性をチェックする際に使用する((strDest=0)|(strSrc=0))ことは、回答者が定数の使用のメリットを知らないことを示している.この例の0のような字面定数を直接使用すると、プログラムのメンテナンス性が低下します.0は簡単ですが、プログラムにはポインタのチェックが多く発生する可能性があります.万が一、誤記が発生した場合、コンパイラは発見できません.生成されたプログラムには論理的なエラーが含まれており、排除しにくいです.0の代わりにNULLを使用すると、スペルミスが発生するとコンパイラがチェックされます.[2] (A)return new string("Invalid arguments");,回答者は返す価値があることを全く知らず、メモリの漏洩にも警戒心がなく、関数体から関数体内に割り当てられたメモリを返すのは非常に危険な方法であり、メモリを解放する義務を知らない呼び出し者に投げつけ、ほとんどの場合、呼び出し者はメモリを解放せず、メモリ漏洩(B)return 0を招く.回答者が異常なメカニズムを把握していないことを説明します.呼び出し元は戻り値のチェックを忘れてしまう可能性があります.呼び出し元は戻り値をチェックできない可能性があります(後述のチェーン式を参照).妄想は戻り値に正しい値と異常値を返す二重機能を背負わせ,その結果,両機能とも失効することが多い.戻り値の代わりに例外を投げ出すべきであり、呼び出し者の負担を軽減し、エラーが無視されないようにし、プログラムのメンテナンス性を向上させることができる.
(補足:関数はint iLength=strlen(strcpy(strA,strB))を防ぐために出口が1つしかありません.戻ると関数値はそのまま使用される)[3](A)元のstrDest値を保存するのを忘れ,解答者の論理的思考が厳密ではないことを示す.[4](A)サイクルはwhile(*strDest+=*strSrc+);同じ[1](B).注意:付与式の値は、付与に成功した後の左値(B)ループがwhile(*strSrc!='0')*strDest+=*strSrc+++、*解答者が境界条件の検査に力がないことを説明する.ループが終了するとstrDest文字列の末尾に'0'が正しく付加されません.2.strDestの元の値を返すことで、関数がチェーン式をサポートし、関数の「追加値」を追加できます.同様の機能の関数は,合理的に可用性を向上させることができれば,自然とより理想的である.チェーン式の形式は、int iLength=strlen(strcpy(strA,strB);また、char*strA=strcpy(new char[10]、strB);strSrcの元の値を返すのはエラーです.1つは、ソース文字列が既知であることに違いありません.返す意味がありません.二つ目は、第2の例のような表現をサポートすることはできません.三つ目は、ソース文字列を保護するために、strSrcが指す内容をconstで限定し、const char*をchar*として返し、タイプが一致せず、コンパイルが間違っている.