1

stringncopy関数を実装してみました。私はそれに成功しましたが、機能していないコードを最適化しようとしました。

char *mystrncpy(char *dst, const char *src, size_t n)
{
   int i;
   char *temp;
   temp = dst;  
   for (i = 0; i < n; i++)
      *dst++ = *src++;
   return temp;
}

上記のコードは正常に機能しています。

しかし、以下のものにはいくつかの問題があります。渡した値のsrc文字列を返すだけです。n

char *my_strncpy(char *dst, const char*src, size_t n)
{
   char *temp = dst;
   while ((*dst++ = *src++) && (--n));
   return temp;
}
4

3 に答える 3

6

これらの2つのコードフラグメントは同等ではありません。

  • n最初のものは、文字列の内容に関係なく、すべての文字を調べてコピーします。
  • 2つ目は、ヌルターミネータをコピーした直後、またはn文字をコピーしたときのいずれか早い方で停止します。

strncpy最初の実装も2番目の実装も、ターミネータまでコピーし、残りのスペースをゼロで埋め続ける標準ライブラリの実装と同等ではありません。関数を標準に準拠させるには、returnステートメントの前に次の行を追加します。

for (; n-- ; *dst++ = '\0');

もう1つの注意点は、背後にある意図strncpyが誤解されることが多いということです。固定長の文字列を処理するためのものであり、制限が固定された可変長の文字列を処理するためのものではありません。そのため、取得した結果をnullで終了する必要があります。文字列が文字よりも長い場合strncpy、結果の文字列はnullで終了しません。srcn

于 2013-01-04T15:09:08.523 に答える
3

2番目のバージョンは、を超える可能性があるため、機能しませんnn == 0前のテストを引っ張る

while (n-- && (*dst++ = *src++))
    ;

;行の最後にを置かないでください。見逃しがちです。

サンプルの実装は次の場所で確認できます。man strncpy

于 2013-01-04T15:09:57.710 に答える
1

このコードを使用できるのは、シンプルであるほど良いことです。

void Strncpy( char* _dst, const char* _src, size_t _n )
{
   size_t i = 0;
   while(i++ != _n && (*_dst++ = *_src++));
}
于 2018-02-24T20:42:57.943 に答える