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