memmove関数 - メモリ領域をバイト単位でコピーする
memmove関数は、メモリ領域をバイト単位でコピーする関数です。「string.h」をインクルードします。memcpy関数は、コピー先とコピー元のデータ領域が重なっていた場合には、動作は保証されませんが、memmove関数は保証されます。
#include <string.h> void *memmove(void *buf1, const void *buf2, size_t n);
第一引数はコピー先のアドレスです。汎用ポインタ型ですので、どのポインタ型でも大丈夫です。
第二引数はコピー元のアドレスです。汎用ポインタ型ですので、どのポインタ型でも大丈夫です。
第三引数にバイトサイズを指定します。size_t型です。int32_t型までの範囲で0以上の数値であれば、まず安心です。0の指定は有効な引数で、この場合コピーは行われません。
文字列をの先頭の文字を削除する
memmove関数で文字列をの先頭の文字を削除するするサンプルです。領域が重なっているのでmemmove関数を使います。strlen関数で文字列の長さを取得しています。
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
int main(void) {
// 変数名
const char* var_name = "$foo";
// 変数名の長さ
int32_t var_name_length = strlen(var_name);
// 変数名をコピー
char* var_name_alphabet = calloc(var_name_length + 1, sizeof(char));
memcpy(var_name_alphabet, var_name, var_name_length);
// 変数名をアルファベットの部分だけにする
memmove(var_name_alphabet, var_name_alphabet + 1, var_name_length - 1);
var_name_alphabet[var_name_length - 1] = '\0';
printf("%s\n", var_name_alphabet);
free(var_name_alphabet);
}
出力結果です。
foo
C言語ゼミ


