7.4.13 < string.h>

文字配列の操作に必要な種々の関数を定義します。

種別

定義名

説明

関数

memcpy

複写元の記憶域の内容を指定した大きさ分、複写先の記憶域に複写します。

strcpy

複写元の文字列の内容を、複写先の記憶域にヌル文字も含めて複写します。

strncpy

複写元の文字列を指定された文字数分、複写先の記憶域に複写します。

strcat

文字列の後に、文字列を連結します。

strncat

文字列に文字列を指定した文字数分、連結します。

memcmp

指定された2つの記憶域の比較を行います。

strcmp

指定された2つの文字列を比較します。

strncmp

指定された2つの文字列を指定された文字数分まで比較します。

memchr

指定された記憶域において、指定された文字が最初に現われる位置を検索します。

strchr

指定された文字列において、指定された文字が最初に現われる位置を検索します。

strcspn

指定された文字列を先頭から調べ、別に指定した文字列中の文字以外の文字が先頭から何文字続くか求めます。

strpbrk

指定された文字列において、別に指定された文字列中の文字が最初に現われる位置を検索します。

strrchr

指定された文字列において指定された文字が最後に現われる位置を検索します。

strspn

指定された文字列を先頭から調べ別に指定した文字列中の文字が先頭から何文字続くかを求めます。

strstr

指定された文字列において、別に指定した文字列が最初に現われる位置を検索します。

strtok

指定した文字列をいくつかの字句に切り分けます。

memset

指定された記憶域の先頭から指定された文字を指定された文字数分設定します。

strerror

エラーメッセージを設定します。

strlen

文字列の文字数を計算します。

memmove

複写元の記憶域の内容を、指定した大きさ分、複写先の記憶域に複写します。複写元と複写先の記憶域が重なっていても、正しく複写されます。

処理系定義仕様

 

項目

コンパイラの仕様

1

strerror関数が返すエラーメッセージの内容

10.5.6 C標準ライブラリ関数のエラーメッセージを参照してください。

本標準インクルードファイル内で定義されている関数を使用する時は、以下の2つの事項に注意する必要があります。

(1) 文字列の複写を行う時、複写先の領域が複写元の領域よりも小さい場合、動作は保証しませんので注意が必要です。

char a[]="abc";

char b[3];

strcpy(b,a);

 

この場合、配列aのサイズは(ヌル文字を含めて)4バイトです。したがって、strcpy関数によって複写を行うと、配列bの領域以外のデータを書き換えることになります。

 

(2) 文字列の複写を行う時、複写元の領域と複写先の領域が重なっていると正しい動作は保証しませんので注意が必要です。

int a[]="a";

:

:

strcpy(&a[1], a);

:

:

 

この場合、複写元の文字列がヌル文字に達する以前に、ヌル文字の上に文字'a'を書き込むことになります。したがって、複写元の文字列のデータに続くデータを書き換えることになります。

 

memcpy

複写元の記憶域の内容を、指定した大きさ分、複写先の記憶域に複写します。

 

[指定形式]

#include <string.h>

void *memcpy(void *s1, const void *s2, size_t n);

 

[引数]

s1 複写先の記憶域へのポインタ

s2 複写元の記憶域へのポインタ

n 複写する文字数

 

[戻り値]

s1の値

 

strcpy

複写元の文字列の内容を、複写先の記憶域にヌル文字も含めて複写します。

 

[指定形式]

#include <string.h>

char *strcpy(char *s1, const char *s2);

 

[引数]

s1 複写先の記憶域へのポインタ

s2 複写元の文字列へのポインタ

 

[戻り値]

s1の値

 

strncpy

複写元の文字列を指定された文字数分、複写先の記憶域に複写します。

 

[指定形式]

#include <string.h>

char *strncpy(char *s1, const char *s2, size_t n);

 

[引数]

s1 複写先の記憶域へのポインタ

s2 複写元の文字列へのポインタ

n 複写する文字数

 

[戻り値]

s1の値

 

[備考]

s2で指された文字列の先頭から最高n文字をs1で指される記憶域に複写します。s2で指定された文字列の文字数がn文字より短い時は、n文字になるまでヌル文字が付加されます。

s2で指された文字列の文字数がn文字より長い時は、s1に複写された文字列はヌル文字で終了しないことになります。

 

strcat

文字列の後に、文字列を連結します。

 

[指定形式]

#include <string.h>

char *strcat(char *s1, const char *s2);

 

[引数]

s1 連結される文字列へのポインタ

s2 連結する文字列へのポインタ

 

[戻り値]

s1の値

 

[備考]

s1で指された文字列の最後に、s2で指された文字列を連結します。この時、s2の指す文字列の最後を示すヌル文字も複写します。また、s1で指された文字列の最後のヌル文字は削除されます。

 

strncat

文字列に文字列を指定した文字数分連結します。

 

[指定形式]

#include <string.h>

char *strncat(char *s1, const char *s2, size_t n);

 

[引数]

s1 連結される文字列へのポインタ

s2 連結する文字列へのポインタ

n 連結する文字数

 

[戻り値]

s1の値

 

[備考]

s2で指された文字列の先頭から最高n文字をs1で指された文字列の最後に付加します。s1で指された文字列の最後のヌル文字はs2の先頭文字で置き換えられます。

また、連結された後の文字列の最後には、必ずヌル文字が付加されます。

 

memcmp

指定された2つの記憶域の内容を比較します。

 

[指定形式]

#include <string.h>

long memcmp(const void *s1, const void *s2, size_t n);

 

[引数]

s1 比較される記憶域へのポインタ

s2 比較する記憶域へのポインタ

n 比較する記憶域の文字数

 

[戻り値]

s1で指された記憶域 > s2で指された記憶域の時:正の値

s1で指された記憶域 == s2で指された記憶域の時:0

s1で指された記憶域 < s2で指された記憶域の時:負の値

 

[備考]

s1で指された記憶域とs2で指された記憶域の、最初のn文字分の内容を比較します。

この比較は処理系定義です。

 

strcmp

指定された2つの文字列の内容を比較します。

 

[指定形式]

#include <string.h>

long strcmp(const char *s1, const char *s2);

 

[引数]

s1 比較される文字列へのポインタ

s2 比較する文字列へのポインタ

 

[戻り値]

s1で指された文字列 > s2で指された文字列の時:正の値

s1で指された文字列 == s2で指された文字列の時:0

s1で指された文字列 < s2で指された文字列の時:負の値

 

[備考]

s1で指された文字列と、s2で指された文字列の内容を比較し、その結果をリターン値として設定します。

この比較は処理系定義です。

 

strncmp

指定された2つの文字列を指定された文字分まで比較します。

 

[指定形式]

#include <string.h>

long strncmp(const char *s1, const char *s2, size_t n);

 

[引数]

s1 比較される文字列へのポインタ

s2 比較する文字列へのポインタ

n 比較する文字数の最大値

 

[戻り値]

s1で指された文字列 > s2で指された文字列の時:正の値

s1で指された文字列 == s2で指された文字列の時:0

s1で指された文字列 < s2で指された文字列の時:負の値

 

[備考]

s1で指された文字列と、s2で指された文字列を最初のn文字以内の範囲で、その内容を比較します。

この比較は処理系定義です。

 

memchr

指定された記憶域において、指定された文字が最初に現われる位置を検索します。

 

[指定形式]

#include <string.h>

void *memchr(const void *s, long c, size_t n);

 

[引数]

s 検索を行う記憶域へのポインタ

c 検索する文字

n 検索を行う文字数

 

[戻り値]

検索の結果見つかった時 :見つけられた文字へのポインタ

検索の結果見つからなかった時 :NULL

 

[備考]

sで指定された記憶域の先頭からn文字の中で最初に現われたcの文字と同一文字の位置へのポインタをリターン値として返します。

 

strchr

指定された文字列において、指定された文字が最初に現われる位置を検索します。

 

[指定形式]

#include <string.h>

char *strchr(const char *s, long c);

 

[引数]

s 検索を行う文字列へのポインタ

c 検索する文字

 

[戻り値]

検索の結果見つかった時 :見つけられた文字へのポインタ

検索の結果見つからなかった時 :NULL

 

[備考]

sで指定された文字列中で最初に現われたcの文字と同一文字へのポインタをリターン値として返します。

sによって指される文字列の終了を現わすヌル文字も検索の対象として含まれます。

 

strcspn

指定された文字列を先頭から調べ、別に指定した文字列中の文字以外の文字が先頭から何文字続くか求めます。

 

[指定形式]

#include <string.h>

size_t strcspn(const char *s1, const char *s2);

 

[引数]

s1 調べられる文字列へのポインタ

s2 s1を調べるための文字列へのポインタ

 

[戻り値]

s2が指す文字列を構成する文字以外の文字が構成される文字列s1の先頭からの長さ

 

[備考]

s2が指す文字列を構成する文字以外の文字が、文字列として何文字続くかをs1で指された文字列の先頭から調べ、その文字列の文字数をリターン値として返します。

s2によって指される文字列の終了を表すヌル文字は、s2で指された文字列の一部とはみなされません。

 

strpbrk

指定された文字列内において、別に指定された文字列中の文字が最初に現われる位置を検索します。

 

[指定形式]

#include <string.h>

char *strpbrk(const char *s1, const char *s2);

 

[引数]

s1 検索を行う文字列へのポインタ

s2 s1内で検索する文字を示す文字列へのポインタ

 

[戻り値]

検索の結果見つかった時 :見つかった文字へのポインタ

検索の結果見つからなかった時 :NULL

 

[備考]

s1で指された文字列において、s2で指された文字列中の文字の一つが最初に現われる所を検索し、そのポインタをリターン値として返します。

 

strrchr

指定された文字列において、指定された文字が最後に現われる位置を検索します。

 

[指定形式]

#include <string.h>

char *strrchr(const char *s, long c);

 

[引数]

s 検索を行う文字列へのポインタ

c 検索する文字

 

[戻り値]

検索の結果見つかった時 :見つかった文字へのポインタ

検索の結果見つからなかった時 :NULL

 

[備考]

sで指された文字列の中でcで指定する文字と同一の文字が最後に現われた位置へのポインタをリターン値として返します。

sによって指される文字列の終了を表すヌル文字も検索の対象として含まれます。

 

strspn

指定された文字列を先頭から調べ、別に指定した文字列中の文字が先頭から何文字続くかを求めます。

 

[指定形式]

#include <string.h>

size_t strspn(const char *s1, const char *s2);

 

[引数]

s1 調べられる文字列へのポインタ

s2 s1を調べるための文字列へのポインタ

 

[戻り値]

s1の先頭から、s2で指定した文字が続いている文字数

 

[備考]

s2が指す文字列を構成する文字が文字列として何文字続くかをs1で指された文字列の先頭から調べ、その文字列の文字数をリターン値として返します。

 

strstr

指定された文字列において、別に指定した文字列が最初に現われる位置を検索します。

 

[指定形式]

#include <string.h>

char *strstr(const char *s1, const char *s2);

 

[引数]

s1 検索を行う文字列へのポインタ

s2 検索する文字列へのポインタ

 

[戻り値]

検索の結果見つかったとき :見つけられた文字へのポインタ

検索の結果見つからなかったとき :NULL

 

[備考]

s1で指された文字列において、s2で指された文字列が最初に現われる所を検索し、そのポインタをリターン値として返します。

 

strtok

指定した文字列をいくつかの字句に切り分けます。

 

[指定形式]

#include <string.h>

char *strtok(char *s1, const char *s2);

 

[引数]

s1 いくつかの字句に切り分ける文字列へのポインタ

s2 文字列を切り分けるための文字からなる文字列へのポインタ

 

[戻り値]

字句に切り分けられた時 :切り分けた字句の先頭へのポインタ

字句に切り分けられなかった時 :NULL

 

[備考]

strtok関数は文字列を切り分けるために連続的に呼び出されます。

(a)

最初の呼び出し時

s1で指された文字列を先頭からs2で指された文字列中の文字によって字句に切り分けます。その結果字句に切り分けられれば、その字句の先頭へのポインタを、分けられなければNULLをリターン値として返します。

(b)

2回目以降の呼び出し時

以前に切り分けられた字句の次の文字から、s2で指された文字列中の文字によって字句に切り分けます。その結果字句に切り分けられれば、その字句の先頭へのポインタを、分けられなければNULLをリターン値として返します。

2回目以降の呼び出しの時は、第1引数にはNULLを指定します。また、s2で指された文字列は呼び出しのたびに異なっていてもかまいません。切り出された字句の最後にはヌル文字が付きます。

strtok関数の使用例を以下に示します。

 

1 #include <string.h>

2 static char s1[]="a@b,@c/@d";

3 char *ret;

4

5 ret=strtok(s1,"@");

6 ret=strtok(NULL,",@");

7 ret=strtok(NULL,"/@");

8 ret=strtok(NULL,"@");

 

【説明】

この例は、文字列「"a@b,@c/@d"」をstrtok関数を用いてa,b,c,dという字句に切り分けるプログラムを示しています。

2行目で文字列s1に初期値として、文字列"a@b,@c/@d"を設定しています。

5行目では、「@」を区切り文字として字句を切り分けるため、strtok関数を呼び出します。この結果、文字'a'へのポインタがリターン値として得られ、文字'a'の次の最初の区切り文字である「@」にヌル文字を埋め込みます。この結果、文字列"a"が切り出されます。

以下、同一の文字列から次々に字句を切り出すために第1引数にNULLを指定してstrtok関数を呼び出します。

この結果、文字列"b"、"c"、"d"が次々に切り出されます。

 

memset

指定された記憶域の先頭から、指定された文字を指定された文字数分設定します。

 

[指定形式]

#include <string.h>

void *memset(void *s, long c, size_t n);

 

[引数]

s 文字が設定される記憶域へのポインタ

c 設定する文字

n 設定する文字数

 

[戻り値]

sの値

 

[備考]

sで指された記憶域にn文字分、文字cを設定します。

 

strerror

エラー番号を指定して、それに対するエラーメッセージを返します。

 

[指定形式]

#include <string.h>

char *strerror(long s);

 

[引数]

s エラー番号

 

[戻り値]

エラー番号に対応するエラーメッセージ(文字列)へのポインタ

 

[備考]

エラー番号sに対応するエラーメッセージへのポインタをリターン値として返します。

エラーメッセージの内容に関しては処理系定義です。

リターン値として返されたエラーメッセージを修正した時、動作は保証しません。

 

strlen

文字列の文字数を計算します。

[指定形式]

 

#include <string.h>

size_t strlen(const char *s);

 

[引数]

s 長さを求める文字列へのポインタ

 

[戻り値]

文字列の文字数

 

[備考]

sが指す文字列の終了を表すヌル文字は、文字列の文字数としては計算に入れません。

 

memmove

複写元の記憶域の内容を指定した大きさ分、複写先の記憶域に複写します。また、複写元と複写先の記憶域が、重なっている部分があっても、複写元の重なっている部分を上書きする前に複写するので正しく複写されます。

 

[指定形式]

#include <string.h>

void *memmove(void *s1, const void *s2, size_t n);

 

[引数]

s1 複写先の記憶域へのポインタ

s2 複写元の記憶域へのポインタ

n 複写する文字数

 

[戻り値]

s1の値