本物のC

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の文字列はヌルで終わらない事になります。)

これらの関数はコピー元とコピー先が被っていると正しく動かない可能性があるのですが、memmovememcpyと同じ事をそうした問題が起こらない様に行います。

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);

三つの関数の違いはコピーの場合と同じです。

検索

memchrstrchrは第二引数の値が最初に現れる場所を調べます。見付からなかった場合は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);