0

C に 2 つの配列があり、 array1 の N 個のセルを array2 にコピーしたいと考えています。

さらに、コピーされたセルの正確な数を取得したいと考えています。

関数strncpyは戻り値を持たないため (または戻り値を持っていますが、私が探しているものではないため)、その関数には十分ではありません。

どんな提案も歓迎します

4

3 に答える 3

2

これはどう:

size_t copy_n(T * dst, T const * src, size_t n)
{
    // method 1
    while (n--) { *dst++ = *src++; }

    // === OR ===

    // method 2
    memcpy(dst, src, n * sizeof(T));

    return n;
}

使用法:

T a[10];
T b[25];

copy_n(b + 5, a + 2, 7);  // copies a[2]...a[8] into b[5]...b[11]

これは、固定の割り当て可能な type に対してのみ機能しTます。汎用関数が必要な場合は、サイズ引数を渡し、memcpy範囲全体で使用します。

size_t generic_copy_n(void * dst, void const * src, size_t size, size_t n)
{
    memcpy(dst, src, n * size);
    return n;
}
于 2012-08-05T12:50:46.397 に答える
1

memcpyを使用できます

memcpy(Array2,Array1,sizeof(*Array1)*N);

これは問題なくコピーされ、「アクセス違反」というポップアップが自動的に表示される失敗を除いて、いったん通知されるとタスクが終了するため、いくつでも気にする必要はありません。

于 2012-08-05T12:43:05.683 に答える
1

と同じ効果を達成したいstrncopyだけでなく、コピーされたバイト数も知りたいと思います。これは、次のコードで実行できます。

size_t special_strncopy(char * dest, const char * src, size_t count){
    const size_t original = count--;
    if(count != 0){
        while(*src && count--){
           *dest++ = *src++;
        }
    }
    *dest = '\0'; /* set null-termination symbol */
    return original - count;
}

Notecount == 0には 0 記号が含まれているため、未定義の動作が発生します。

于 2012-08-05T12:58:15.477 に答える