C言語,memmove()関数で同じ領域のデータを前後に移動する

スポンサーリンク

鍛錬 743

C言語,memmove()関数で同じ領域のデータを前後に移動する

配列のデータをコピーする際、コピー元とコピー先のメモリ領域が重なっている場合は、memmove()関数を使用してコピーする方法があります。
 
以下は、memmove()関数についてです。

#include <string.h>

void *memmove(void *dest, const void *src, size_t n);
 

 
コピー元とコピー先のメモリ領域が重なっている場合でもコピーが可能です。

引数

以下は、上記の引数についてです。

引数 意味
void *dest コピー先のメモリ領域
const void *src コピー元のメモリ領域
size_t n コピーするバイト数

戻り値

以下は、戻り値についてです。

戻り値
void コピー先のメモリ領域へのポインタ
 
スポンサーリンク

プログラム

以下は、配列に格納された文字列を、配列の領域内で前後に移動させる(コピーする)プログラム、test_memmove.c です。

今回は、文字列「123456789」を、次の通り移動させています。

1回目の文字列操作

  • 3文字目以降の文字列を、同じ配列の先頭にコピーする。
順序 配列のデータ
1 123456789
2 3456789

2回目の文字列操作:

  1. 先頭からの文字列全てを、同じ配列の4バイト目以降にコピーする。
  2. 配列の先頭3バイトに、文字「A」「B」「C」を格納する。
順序 配列のデータ
1 123456789
2    123456789
3 ABC123456789
// include
#include <stdio.h>
#include <string.h>

// main
int main(void)
{
	char str[256] = "";
	
	printf("-------------------------------------\n");
	
	// 3文字目以降の文字列を,同じ配列の先頭にコピー
	strncpy(str, "123456789", sizeof(str) - 1);
	printf("コピー前 --> [%s]\n", str);
	memmove(str, &str[2], 7);
	str[7] = '\0';
	printf("コピー後 --> [%s]\n", str);
	
	printf("-------------------------------------\n");
	
	// 先頭からの文字列全てを,同じ配列の4バイト目以降にコピー.
	// 空いた配列の先頭3バイトに,文字 A,B,C を格納.
	strncpy(str, "123456789", sizeof(str) - 1);
	printf("コピー前 --> [%s]\n", str);
	memmove(&str[3], str, 9);
	str[12] = '\0';
	str[0] = 'A';
	str[1] = 'B';
	str[2] = 'C';
	printf("コピー後 --> [%s]\n", str);
	
	printf("-------------------------------------\n");
	
	return 0;
}

実行結果

以下は、プログラム test_memmove.c を実行しています。

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra test_memmove.c -o test_memmove
***@ubuntu:~/***/test/c$ ./test_memmove
-------------------------------------
コピー前 --> [123456789]
コピー後 --> [3456789]
-------------------------------------
コピー前 --> [123456789]
コピー後 --> [ABC123456789]
-------------------------------------

 
上記に示した通り、データを配列の領域内で前後に移動させることができました。

スポンサーリンク

シェアする

フォローする