 |
≫ |
|
|
 |
名称文字列関数: strcasecmp(), strcat(), strchr(), strcmp(),
strcoll(), strcpy(), strcspn(), strdup(), strlen(), strncasecmp(),
strncat(), strncmp(), strncpy(), strpbrk(), strrchr(), strrstr(),
strspn(), strstr(), strtok(), strtok_r(), strxfrm(), index(), rindex() ― 文字列操作 構文#include <string.h> #include <strings.h> char *strcat(char *s1, const char *s2); char *strncat(char *s1, const char *s2, size_t n); int strcmp(const char *s1, const char *s2); int strncmp(const char *s1, const char *s2, size_t n); int strcasecmp(const char *s1, const char *s2); int strncasecmp(const char *s1, const char *s2, size_t n); char *strcpy(char *s1, const char *s2); char *strncpy(char *s1, const char *s2, size_t n); char *strdup(const char *s); size_t strlen(const char *s); char *strchr(const char *s, int c); char *strrchr(const char *s, int c); char *strpbrk(const char *s1, const char *s2); size_t strspn(const char *s1, const char *s2); size_t strcspn(const char *s1, const char *s2); char *strstr(const char *s1, const char *s2); char *strrstr(const char *s1, const char *s2); char *strtok(char *s1, const char *s2); char *strtok_r(char *s1, const char *s2, char **last); int strcoll(const char *s1, const char *s2); size_t strxfrm(char *s1, const char *s2, size_t n); char *index(const char *s, int c); char *rindex(const char *s, int c); 注index() と rindex() を除くすべての関数は、両方のヘッダーファイルで宣言されているので、
2 つのヘッダーファイルのうち 1 つだけをインクルードすればいいことになります。 関数 index() と rindex() は、 <strings.h>
と <strings.h> にだけ宣言されています。
これらの関数は、BSD 系のアプリケーションの移植性のため で、移植性を重要視する新しいアプリケーション
にはお勧めできません。 移植可能なアプリケーションには、 <string.h>, strchr() および strrchr() を代わりに使ってください。 説明引き数 s1, s2, および s は、文字列 (null で終る文字の配列) を指します。 これらすべての関数、型 size_t、 および定数 NULL は、ヘッダーファイル <string.h> に定義されています。 | strcat() | | 文字列 s2 を文字列 s1 の末尾に連結します。 strncat() は、文字列 s2 を文字列 s1 の末尾に最大 n 文字連結します。 s2 が n 文字より短い場合、そのまま連結します。 どちらの関数も
null で終了する連結後の結果 s1 の値) を指すポインターを返します。 | | strcmp() | | 文字列の引き数を比較して、文字コードの大小関係を比較しながら s1 が s2 より小さいか、等しいか、大きいかによって、負の整数、0、正の整数を返します。
対応する文字の比較は、文字の型があたかも unsigned char であるかのように行われます。 s1 と s2 に対する null ポインターは、空の文字列へのポインターと同じに扱われます。 strncmp() は、同様の比較を行いますが、最大 n 文字 (0 以下の n では等しい動作は行わない) の比較を行います。 strcasecmp() は strcmp() と、 strncasecmp() は strncmp() と機能についてそれぞれ同様ですが、文字は、比較に先立って _tolower() conv(3C) を参照) によって変換されます。
返される大小関係には、小文字への変換が反映されます。 | | strcpy() | | 文字列 s2 を文字列 s1 に null までコピーします。 strncpy() は、ちょうど n 文字をコピーし、必要なら n 文字全部が書かれるまで、 s2 を切り詰めたり、 s1 に null を加えます。 s2 が、 n 以上の場合、 s1 は、null で終了しません。 どちらの関数も s1 を返します。 strncpy() を任意の構造体の n バイトのコピーに使わないよう注意してください。 その構造体の中に
null があると、 strncpy() は、ソースから宛先へ、 n バイト未満をコピーし、残りを null で満たします。 memcpy() 関数 memory(3C) を参照) を使って任意のバイナリデータをコピーしてください。 | | strdup() | | s1 が指す文字列のコピーである新しい文字列を指すポインターを返します。
新しい文字列の領域は、 malloc() 関数 malloc(3C) を参照) を使って確保します。 | | strlen() | | 末尾の null を除いた s の文字数を返します。 | | strchr() | | (strrchr()) 文字列 s 中の最初 (最後) に文字 c が現れる位置へのポインターを返します。 また、 c が文字列中にないときは、null ポインターを返します。
文字列の末尾にある null は、文字列の一部として扱われます。 index() (rindex())
は strchr() (strrchr()) と同じもので、BSD
系のアプリケーションへの移植性のみ備わっています。 | | strpbrk() | | 文字列
s1 内に文字列 s2 内の任意の文字が現れる最初の位置へのポインターを返します。
また、 s2 内の文字が s1 内にないときは、null ポインターを返します。 | | strspn() | | (strcspn()) 文字列 s1 内で、文字列 s2 内の文字 (文字列 s2 にない文字) だけからなる最大の先頭セグメントの長さを返します。 | | strstr() | | (strrstr()) 文字列 s1 内に文字列 s2 が最初 (最後) に現れる位置へのポインターを返します。
また、文字列中に
s2 がなければ、NULL ポインターを返します。 s2 が大きさ 0 の文字列を指すとき、 strstr() (strrstr())
は s1 を返します。 | | strtok() | | 文字列 s1 を、分離された文字列 s2 内の 1 つ以上の文字で区切られた 0 以上のテキストトークンの連なりからなるものとみなします。
最初の (null でないポインター s1 を指定しての) 呼び出しで、最初のトークンの先頭の文字を指すポインターを返し、そのトークンに続いて s1 に null を書き込みます。 個々の呼び出しで、文字列 s1 でのテキストトークンの位置を見失わないので、以降の、最初の引き数を
null ポインターにする呼び出しが、続く文字列に行われます。 このようにして、トークンが 1 つもなくなるまで、個々の呼び出しが文字列 s1 に行われます。分離された文字列 s2 は、呼び出しが違っていても構いません。 s1 にトークンが 1 つもなくなると、null ポインターが返されます。 | | strtok_r() | | strtok() と同じですが、3 番目の引き数として文字列ポインターのアドレスが渡される点が異なります。
この引き数を使って、検索対象の文字列内の現在の位置を追跡します。
ポインターを文字列内の現在のトークンに返すか、トークンが存在しない場合はヌル値を返します。 | | strcoll() | | s1 が指す文字列が、 s2 が指す文字列に対して大きいか、等しいか、小さいかによって、正の整数、0、負の整数を返します。
比較は、プログラムの locale (以下の「ロケール」を参照) に適するように解釈された文字列に基づいています。
``C'' の locale では、 strcoll() は、 strcmp() と同様に働きます。 | | strxfrm() | | s2 が指す文字列を変換し、その結果の文字列を s1 が指す配列に格納します。 この変換は、 strcmp() 関数を変換された 2 つの文字列に用いる場合、変換前の 2 つの文字列に strcoll() 関数を適用し、その結果に応じて正、0、負の値を返すようになっています。
終端にある null 文字を含んで、 n バイトしか出力文字列には格納されません。 変換後の文字列が n バイト以下しかない場合、出力文字列の長さが返されます
(終端にある null 文字は含まれていません)。 n バイト以上のとき、返す値は文字列 s1 が占めている (終端にある null 文字は含まれない) バイト数になり、配列の内容は、確定しません。 |
指定した文字列が 2、3 回しか他の文字列と比較されない場合や、比較する文字列が長いけれど、相対的な順序を決める文字列中の違いが通常、最初の 2、3 文字で決まってしまう場合には、 strcoll() が、 strxfrm() より優れた性能を持っています。 strxfrm() は、たとえば、多くの文字列がそれぞれ一度だけ変換され、変換後の文字列が互いに何度も比較し合うようなソートルーチンに対して優れた働きを行います。 多言語化対応ロケールLC_CTYPE カテゴリは、 strcoll() および strxfrm() 関数に対する文字列引き数中のバイトの解釈を、半角文字または全角文字、あるいはその両方として決定します。
また strcasecmp() および strncasecmp() 関数に対して、大文字小文字変換を行うことを決定します。 LC_COLLATE カテゴリは、 strcoll() および strxfrm() 関数で使われる照合順序を決定します。 サポートされる国際的コードセットシングル/マルチバイトの文字コードセットは、 strcoll() および strxfrm() 関数に対してサポートされています。
他のすべての関数は、シングルバイト文字コードセットのみをサポートしています。 例以下のサンプルコードは、ブランクで区切られている、 文字列 s 中のトークンを見つけるものです (トークンの最大数は MAXTOK とします)。 int i = 0; char *s, *last, *tok[MAXTOK]; tok[0] = strtok_r(s, " ", &last); while (tok[++i] = strtok_r(NULL, " ", &last)); 警告関数 strcat(), strncat(), strcpy(), strncpy(), strtok(),
および strtok_r() は、 s1 が指す配列の内容を変更します。 これらの関数は、配列のオーバーフローをチェックしません。 宛先の文字列の null ポインターは、不定の動作を引き起こします。 文字の移動は、インプリメンテーションに依存しています。重複したソースと宛先の文字列の間の移動などでは、予測できないことが起こり得ます。 8 ビットコードセットを使う言語に対して strxfrm() によって生成された変換後の文字列は、通常、元の文字列の少なくとも 2 倍の大きさで、4 倍の大きさにもなり得ます (通常の文字は、変換後の文字列中で 2 バイトを占め、1 対 2 の文字は 4 バイト、2 対 1 の文字は 2 バイト、関係のない文字は 0 バイトを占めます)。
全角コード設定のそれぞれの文字 (アジアの言語) は、変換後の文字列で、3 バイトを占めます。 LC_COLLATE カテゴリと LC_CTYPE カテゴリが指定する言語が異なるコードセットを使う場合、
関数 strcoll() および strxfrm() に対しては結果は定義されません。 また、 strtok_r() の使用に際して、 この関数のプロトタイプは、新しいリリースでは POSIX
の新しいスレッド基準に準拠するように、変更されることに注意してください。 著者string() は、カリフォルニア大学バークレイ校、AT&T、OSF、および
HP で開発されました。 標準準拠strcat(): AES, SVID2, SVID3, XPG2, XPG3,
XPG4, FIPS 151-2, POSIX.1, ANSI C strchr(): AES, SVID2, SVID3, XPG2, XPG3,
XPG4, FIPS 151-2, POSIX.1, ANSI C strcmp(): AES, SVID2, SVID3, XPG2, XPG3,
XPG4, FIPS 151-2, POSIX.1, ANSI C strcoll(): AES, SVID3, XPG3, XPG4, ANSI
C strcpy(): AES, SVID2, SVID3, XPG2, XPG3,
XPG4, FIPS 151-2, POSIX.1, ANSI C strcspn(): AES, SVID2, SVID3, XPG2, XPG3,
XPG4, FIPS 151-2, POSIX.1, ANSI C strdup(): SVID2, SVID3 strlen(): AES, SVID2, SVID3, XPG2, XPG3,
XPG4, FIPS 151-2, POSIX.1, ANSI C strncat(): AES, SVID2, SVID3, XPG2, XPG3,
XPG4, FIPS 151-2, POSIX.1, ANSI C strncmp(): AES, SVID2, SVID3, XPG2, XPG3,
XPG4, FIPS 151-2, POSIX.1, ANSI C strncpy(): AES, SVID2, SVID3, XPG2, XPG3,
XPG4, FIPS 151-2, POSIX.1, ANSI C strpbrk(): AES, SVID2, SVID3, XPG2, XPG3,
XPG4, FIPS 151-2, POSIX.1, ANSI C strrchr(): AES, SVID2, SVID3, XPG2, XPG3,
XPG4, FIPS 151-2, POSIX.1, ANSI C strspn(): AES, SVID2, SVID3, XPG2, XPG3,
XPG4, FIPS 151-2, POSIX.1, ANSI C strstr(): AES, SVID3, XPG3, XPG4, FIPS
151-2, POSIX.1, ANSI C strtok(): AES, SVID2, SVID3, XPG2, XPG3,
XPG4, FIPS 151-2, POSIX.1, ANSI C strxfrm(): AES, SVID3, XPG3, XPG4, ANSI
C
|