独学C言語 独学C言語 中級

2024年版 C言語・中級レベル ~標準関数 memcpy, memset~

標準関数 memset, memcpy

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

void main(void) {
    char str1[32];
    char str2[8];

    memset(str2, 'A', sizeof(str2));    // 'A' で str2 を埋める
    memcpy(str1, str2, sizeof(str2)); // str2 を str1 へコピー
    str1[sizeof(str2)] = 0;                  // str1 の最後にNULLをセット
    printf("%s\n", str1);                    // str1 を表示する
}

実行結果

AAAAAAAA

memcpy関数 や memset関数 は、文字コードだけでなくバイナリまで扱えます。
それに対して、strcpy関数 や strcmp関数は、文字コードしか扱えません。
使い分けましょう。

memcpy関数を使用するのは、malloc関数で確保したメモリ空間をNULLで初期化するなどです。

標準関数 memcpy と strncpy の動作の違い

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

int main(void) {
    char sdata[] = "abc\0def";
    char ddata[256];
    int i;

    memset(ddata, '\0', sizeof(ddata));
    memcpy(ddata, sdata, sizeof(sdata));
    for( i = 0 ; i < sizeof(sdata) ; i++ )
        printf("%d : %c\n", i, ddata[i]);

    memset(ddata, '\0', sizeof(ddata));
    strncpy(ddata, sdata, sizeof(sdata));
    for( i = 0 ; i < sizeof(sdata) ; i++ )
        printf("%d : %c\n", i, ddata[i]);
}

 

実行結果

0 : a
1 : b
2 : c
3 :
4 : d
5 : e
6 : f
7 :
0 : a
1 : b
2 : c
3 :
4 :
5 :
6 :
7 :

memcpy関数を使用すると途中にNULLが入っていてもコピーされますが、strncmp関数を使用すると4バイト目のNULLでコピーが終了します。

-独学C言語, 独学C言語 中級