C言語文字列常用関数学習(一)

3351 ワード

memcpy
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