C言語文字列常用関数学習(一)
memcpy
メモリのコピー
ソースソースソースが指すメモリアドレスの開始位置からnumバイトをターゲットdestinationが指すメモリアドレスの開始位置にコピーします.
ソースポインタとターゲットポインタが指すオブジェクトの基本タイプは関係なく、結果はデータのバイナリコピーです.
この関数は、ソース文字列の終端をチェックせず、常にnum数でバイトをコピーします.
オーバーフローを回避するために、sourceおよびdestination配列の長さは少なくともnumバイトであり、オーバーラップすべきではない(オーバーラップしたメモリブロックの場合、memmoveはより安全な方法である).
例
実行結果:
memmove
メモリブロックの移動
ソースが指すメモリ位置からnumバイトをdestinationが指すメモリ位置にコピーします.レプリケーションは中間バッファで発生し、destinationとsourceが重なることを可能にします.
sourceポインタとdestinationポインタが指すオブジェクトの基本タイプは関係なく、その結果、データのバイナリコピーになります.
この関数は、ソース文字列の終端をチェックせず、常にnum数でバイトをコピーします.
オーバーフローを回避するために、sourceおよびdestination配列の長さは少なくともnumバイトであるべきである.
例
実行結果:
strcpy
文字列のコピー
sourceが指す文字列をdestinationが指す文字列にコピーします.空の文字を終了する(この点で停止する).
オーバーフローを回避するために、destination配列のサイズは、終了空文字を含むsource文字列を収容し、メモリ上でsourceと重複しないように十分に長くなければならない.
例
実行結果:
strncpy
文字列のコピー
ソース文字列の最初のnum文字をdest文字列にコピーし、ソース文字列の長さがnumより小さい場合は、残りのバイトを0 x 00で埋めます.
source文字列の長さがnumより大きい場合、dest文字列の末尾が空でない文字である場合、destは空の終端文字列と見なすべきではありません.そうしないと、読み取り時にオーバーフローします.
sourceとdestは重なるべきではない.
例
実行結果:
void * memcpy ( void * destination, const void * source, size_t num );
メモリのコピー
ソースソースソースが指すメモリアドレスの開始位置からnumバイトをターゲットdestinationが指すメモリアドレスの開始位置にコピーします.
ソースポインタとターゲットポインタが指すオブジェクトの基本タイプは関係なく、結果はデータのバイナリコピーです.
この関数は、ソース文字列の終端をチェックせず、常にnum数でバイトをコピーします.
オーバーフローを回避するために、sourceおよびdestination配列の長さは少なくともnumバイトであり、オーバーラップすべきではない(オーバーラップしたメモリブロックの場合、memmoveはより安全な方法である).
例
/* memcpy example */
#include <stdio.h>
#include <string.h>
struct
{
char name[40];
int age;
} person, person_copy;
int main ()
{
char myname[] ="Pierre de Fermat";
/* using memcpy to copy string: */
memcpy (person.name, myname, strlen(myname)+1 );
person.age = 46;
/* using memcpy to copy structure: */
memcpy ( &person_copy, &person,sizeof(person) );
printf ("person_copy: %s, %d
", person_copy.name, person_copy.age );
return0;
}
実行結果:
person_copy: Pierre de Fermat, 46
memmove
void * memmove ( void * destination, const void * source, size_t num );
メモリブロックの移動
ソースが指すメモリ位置からnumバイトをdestinationが指すメモリ位置にコピーします.レプリケーションは中間バッファで発生し、destinationとsourceが重なることを可能にします.
sourceポインタとdestinationポインタが指すオブジェクトの基本タイプは関係なく、その結果、データのバイナリコピーになります.
この関数は、ソース文字列の終端をチェックせず、常にnum数でバイトをコピーします.
オーバーフローを回避するために、sourceおよびdestination配列の長さは少なくともnumバイトであるべきである.
例
/* memmove example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] ="memmove can be very useful......";
memmove(str+20,str+15,11);
puts(str);
return0;
}
実行結果:
memmove can be very very useful.
strcpy
char * strcpy ( char * destination, const char * source );
文字列のコピー
sourceが指す文字列をdestinationが指す文字列にコピーします.空の文字を終了する(この点で停止する).
オーバーフローを回避するために、destination配列のサイズは、終了空文字を含むsource文字列を収容し、メモリ上でsourceと重複しないように十分に長くなければならない.
例
/* strcpy example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str1[]="Sample string";
char str2[40];
char str3[40];
strcpy (str2,str1);
strcpy (str3,"copy successful");
printf ("str1: %s
str2: %s
str3: %s
",str1,str2,str3);
return 0;
}
実行結果:
str1: Sample string
str2: Sample string
str3: copy successful
strncpy
char * strncpy ( char * dest, const char * source, size_t num );
文字列のコピー
ソース文字列の最初のnum文字をdest文字列にコピーし、ソース文字列の長さがnumより小さい場合は、残りのバイトを0 x 00で埋めます.
source文字列の長さがnumより大きい場合、dest文字列の末尾が空でない文字である場合、destは空の終端文字列と見なすべきではありません.そうしないと、読み取り時にオーバーフローします.
sourceとdestは重なるべきではない.
例
/* strncpy example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str1[]= "To be or not to be";
char str2[40];
char str3[40];
/* copy to sized buffer (overflow safe): */
strncpy ( str2, str1, sizeof(str2) );
/* partial copy (only 5 chars): */
strncpy ( str3, str2, 5 );
str3[5] = '\0'; /* null character manually added */
puts (str1);
puts (str2);
puts (str3);
return 0;
}
実行結果:
To be or not to be
To be or not to be
To be