C言語のstring.hライブラリノート


最近、C言語、C言語自体の文法規則を研究していますが、C 89、C 99などの基準を加えると、やはり複雑です.C言語そのものに加えて、そのライブラリ関数も必要な構成部分であり、本文はまずstringを簡単に分析する.hの関数は,C 99規格を参照している.strtokなどの関数はあまり使わないので、後で使ってから埋めましょう.
1.memcpy:ソースbufferコンテンツの開始nバイトをターゲットbufferにコピーし、bufferオーバーラップをチェックしません.2.memmove:memcpy機能と同様に、bufferが重なる場合を考慮します.C 99仕様におけるmemmoveの解釈は、まずソースbufferを一時的な配列にコピーし、その後、一時配列からターゲットbufferにコピーします.(Copying takes place as if the n characters from the object pointed to by s 2 are first copied into a temporary array of n characters that does not overlap the objects pointed to by s 1 and s 2,and then the n characters from the temporary array are copied into the object pointed to by s 1.)重複部分をVCで最適化した.具体的には、例えば、次のアルゴリズムを実行します.
void * memmove(void * dst, void * src, size_t count) 
{ 
    void * ret = dst; 
    
    if (dst <= src || dst >= (src + count)) { //  if       memcpy    
        /* 
         * Non-Overlapping Buffers 
         * copy from lower addresses to higher addresses 
         */ 
        while (count--) 
            *dst++ = *src++; 
    } else { //  if      buffer   
        /* 
         * Overlapping Buffers 
         * copy from higher addresses to lower addresses 
         */ 
        dst += count - 1; 
        src += count - 1; 
        
        while (count--) 
            *dst-- = *src--; 
    } 
    
    return ret;
}

3.strcpy:'/0'を終了フラグとして、bufferの重複を考慮せずにソース文字列をターゲットbufferにコピーします.オーバーラップを考慮しないため、strcpyのアルゴリズムは簡単です.
char * strcpy (char * dst, char * src) 
{ 
    char * cp = dst; 
    while( *cp++ = *src++ ) 
        ;               /* Copy src over dst */ 
    return dst; 
}

4.strncpy:ターゲットbufferにn文字のみコピーします.nが実際のソース文字列の長さより小さい場合、自動的に'/0'は追加されません.そうしないと、strcpyと同じ効果になります.strncpyもbufferオーバーラップを考慮せず、具体的なアルゴリズムは以下の通りである.
char * strncpy (char * dest, const char * source, unsigned count) 
{ 
    char *start = dest;
    while (count && (*dest++ = *source++)) 
        count--; 
    if (count) 
        while (--count) 
            *dest++ = '/0'; 
    return start; 
}

使用方法:
strncpy(dst, src, MAX_SIZE - 1);

5.strcat:ソース文字列を目的文字列の後ろに接続し、重複を考慮しない.大まかなアルゴリズムは次のとおりです.
char * mystrcat(char * dest, const char * src) 
{ 
    char * start = dest;
    while (*dest++) 
        ; 
    dest--; 
    while (*dest++ = *src++) 
        ;
    return start; 
}

6.strncat:この関数はstrcatと同じで、最大コピーn文字列を制限しているだけで、ソース文字列の実際の長さがn以下であれば、効果はstrcatと同じです.この関数のアルゴリズムは次のとおりです.
char * strncat (char * front, const char * back, unsigned count) 
{ 
    char *start = front;
    while (*front++) 
        ; 
    front--; 
    while (count--) 
        if (!(*front++ = *back++)) 
            return(start); 
    *front = '/0'; 
    return start; 
}

7.memcmp:2つの文字列の前のn文字を比較し、memcmp関数のアルゴリズムとstrcmpの差は多くない.8.strcmp:2つの文字列を比較します.アルゴリズムは少し複雑で、具体的には以下の通りです.
int strcmp (char * src, char * dst) 
{ 
    int ret = 0 ;
    while( ! (ret = *src - *dst) && *dst) 
        ++src, ++dst;
    if ( ret < 0 ) 
        ret = -1; 
    else if ( ret > 0 ) 
        ret = 1;
    return ret; 
}

9.strcoll:この関数は、漢字のピンインで比較するなど、ローカル言語に関連する文字を比較するために使用できます.C 99ではこの部分については深く紹介されていない.10.strncmp:2つの文字列の前のn文字を比較し、中間にnを加えた関数と上の差は多くありません.11.strxfrm:strncpyと同様にローカル言語に関連する文字列コピーただし、コピーされた文字数('/0'を除く)が返されます.12.memchr,strchr:メモリブロックまたは文字列に文字を配置し、最初の文字のアドレスを返します.13.strcspn:str 1を参照して、文字列str 2の文字がstrの文字と等しいかどうかを比較します.(つまりstr 2の文字がstr 1に存在するかどうかを検索する)、初めて等しいことを発見した場合、str 1の一致する等しい文字のインデックス値を停止して返し、失敗するとstr 1の長さを返します.具体的な使い方は1を参照してください.どんな場合に使うか分かりません.14.strpbrk:文字列str 1とstr 2に同じ文字があるかどうかを比較し、ある場合に返します.str 1内の文字の位置のポインタ.15.strrchr:strchrと同じで、文字列の末端から比較するだけです.この関数は、比較時に「/0」の比較を含む.16.strspn:統計s 1の最初から最初の「s 2から来ない文字」が現れるまでの長さは、この文字のインデックスを返します.17.strstrstr:strchrと似ていますが、文字列が検索されています.18.strtok:指定した文字で区切られたサブ文字列を取得するために連続的に呼び出されます.19.memset:メモリブロックを値に設定します.20.strerror:エラー・プロンプト文字列の先頭アドレスをエラー番号で取得します.21.strlen:文字列の長さを計算します.'/0'は含まれません.
参考資料:1.strcspn関数、http://blog.csdn.net/sky2098/archive/2007/03/15/1530607.aspx2.C 99標準