12

memcpy()との大きな違いは何strncpy()ですか? 最初の 2 つの非引数をキャストし、3 番目の引数をその非 char 型のサイズの倍数として変更するstrncpy()だけで、文字だけでなく、必要な任意の型のデータをコピーするように簡単に変更できるため、これをお願いします。次のプログラムでは、それを使用して整数配列の一部を他の配列にコピーすることに成功しました。char*char*memcpy()

 #include <stdio.h>
    #include <string.h>


    int main ()
    {
    int arr[2]={20,30},brr[2]={33,44};
    //memcpy(arr,brr,sizeof(int)*1);
    strncpy((char*)arr,(char*)brr,sizeof(int)*1);
    printf("%d,%d",arr[0],arr[1]);

    }

float同様に、または他のデータ型に対しても機能させることができます。では、 との大きな違いはmemcpy()何ですか?

PS:また、ほとんどすべてのライブラリ関数が文字列に関連しているのに、本質的により汎用的であることを考えるmemcpy()と、なぜヘッダー ファイルにあるのだろうか。何らかの理由?string.hmemcpy()

4

3 に答える 3

23

単純な違いは、memcpy()null 文字が埋め込まれたデータ (別名、C スタイル文字列の文字列ターミネータ)strncpy()をコピーできるのに対し、指定された文字数または最初の null 文字の位置 (およびパッド残りの文字列は 0 です)。

つまり、2 つの非常に異なるユース ケースがあります。

于 2013-05-14T21:39:25.720 に答える
5

たとえば、配列内のこれらの数値を考えてみましょう:

 brr[2]={512,44};

最初の数値の最下位バイトbrr[0]0( 512is 0x200) であり、これにより1) strncpyコピーが停止します。strncpynull 文字に続く文字はコピーしません。

1) 衒学的に (コメントを参照)、これは、実装にsizeof (int) > 1.

于 2013-05-14T21:40:56.190 に答える
0

メモリ ブロックをコピーする必要がある場合は memcpy が便利で、文字列 strncpy の for 内のデータは、'\0' で終了する文字列の自然な利点により意味があります。それ以外の場合、両方とも実行後に同じパターンのコピーを実行します。

于 2014-09-30T09:23:33.067 に答える