C の知識:string.h
文字列(character string)の様にプログラミング分野での「string」は「連なったもの」という意味合いで使われており、string.hはメモリの連続領域を扱うライブラリと言えます。
値を設定する
memsetは指定された値で領域を埋め尽くします。
void *memset(void *s, int c, size_t n); |
ここから「比較する」までの関数の引数は、順に「どこへ」「何を」第三引数もあれば「何文字だけ」を指定します。
例えばmemset(ptr, 0, 256)ならば、ptrの指す位置から 256 バイトを 0 で埋め尽くします。
memsetの第二引数はint型ですが、実際に設定されるのはunsigned charに変換された値です7.21.6.1#2。
コピーする
以下の関数は何れも値をコピーします。
void *memcpy(void * restrict s1, const void * restrict s2, size_t n); | |
char *strcpy(char * restrict s1, const char * restrict s2); | |
char *strncpy(char * restrict s1, const char * restrict s2, size_t n); | |
void *memmove(void *s1, const void *s2, size_t n); |
memcpyは必ずnバイト分をコピーします。一方strcpyはヌル文字に到達するまでコピーし、strncpyはヌル文字に当たらなくてもnバイトでコピーを打ち切ります。(打ち切られた場合、s1の文字列はヌルで終わらない事になります。)
これらの関数はコピー元とコピー先が被っていると正しく動かない可能性があるのですが、memmoveはmemcpyと同じ事をそうした問題が起こらない様に行います。
尚strcpyはバッファオーバーフローの危険があるので、なるべくstrncpyなどコピーする長さに制限のある関数を使うべきです。
比較する
二つのバイト列を比較し、左が大きければ 0 より大きい値を、左右で等しければ 0 を、右が大きければ 0 より小さい値を返します。
int memcmp(const void *s1, const void *s2, size_t n); | |
int strcmp(const char *s1, const char *s2); | |
int strncmp(const char *s1, const char *s2, size_t n); |
三つの関数の違いはコピーの場合と同じです。
検索
memchrやstrchrは第二引数の値が最初に現れる場所を調べます。見付からなかった場合はNULLを返します。
void *memchr(const void *s, int c, size_t n); | |
char *strchr(const char *s, int c); |
長さ
strlenは文字列の長さを調べます。
size_t strlen(const char *s); |