コンテンツにスキップ

C++/標準ライブラリ/文字列ライブラリ

出典: フリー教科書『ウィキブックス(Wikibooks)』

C++ の文字列ライブラリは、 std::string クラスを中心としており、文字列を操作するための様々な機能を提供します。C++の文字列ライブラリは、可変長の文字列を扱うことができ、メモリ上で必要な分だけ文字列を確保することができます。


23 Strings library (strings)[編集]

C++標準ライブラリの文字列ライブラリに関するセクションです。このセクションでは、さまざまな文字列操作を行うためのコンポーネントについて説明しています。具体的には、標準レイアウト(standard-layout)であり、配列ではない単純な(trivial)型のシーケンスを操作するためのコンポーネントです。これらの型は「char-like型」と呼ばれ、char-like型のオブジェクトは「char-likeオブジェクト」、または単に「文字(characters)」と呼ばれます。

23.1 General (strings.general)[編集]

このサブセクションでは、文字列ライブラリの全般的な説明が行われています。

  1. 概要
    この節では、配列でない単純な標準レイアウト型のシーケンスを操作するためのコンポーネントについて説明しています。これらの型は「char-like型」と呼ばれ、それらのオブジェクトは「char-likeオブジェクト」または単に「文字」と呼ばれます。
  2. 内容の概要
    以下の小節で、文字特性クラス、文字列クラス、null終端シーケンスのユーティリティについて説明しています。これらは、Table 78にまとめられています。

Table 78: Strings library summary (tab:strings.summary)[編集]

Table 78: Strings library summary (tab:strings.summary)
小節 ヘッダー
23.2 Character traits <string>
23.3 String view classes <string_view>
23.4 String classes <string>
23.5 Null-terminated sequence utilities <cctype>, <cstdlib>, <cstring>, <cuchar>, <cwchar>, <cwctype>

これにより、C++の文字列ライブラリが提供するさまざまな機能についての概要を把握することができます。各サブセクションでは、それぞれの機能についてさらに詳細に説明されます。

23.2 Character traits[編集]

23.2 Character traits (char.traits)

C++標準ライブラリの文字列ライブラリにおける「Character traits(文字特性)」について説明するセクションです。このセクションでは、文字の特性を表すクラスに関する要件を定義し、具体的なクラステンプレート char_traits<charT> とその特殊化について詳述しています。

23.2.1 General (char.traits.general)[編集]

概要[編集]

  1. 文字特性クラスの要件とクラステンプレート char_traits<charT>
    このサブセクションでは、文字特性を表すクラスに関する要件を定義し、クラステンプレート char_traits<charT> およびその5つの特殊化を定義しています。
    定義されている特殊化は次の通りです:
    • char_traits<char>
    • char_traits<char8_t>
    • char_traits<char16_t>
    • char_traits<char32_t>
    • char_traits<wchar_t>
  2. 関連する型と関数
    セクション 23.4(文字列クラス)、23.3(文字列ビュークラス)、および第31章(入出力ストリーム)のほとんどのクラスは、セマンティクス(意味論)の定義を完成させるために、関連する型と関数のセットを必要とします。
    これらの型と関数は、各テンプレートが使用するテンプレートパラメータ traits にメンバーtypedef名と関数のセットとして提供されます。
    セクション 23.2 では、これらのメンバーのセマンティクスを定義しています。
  3. 特定の文字コンテナ型の取り扱い
    文字列(string)、文字列ビュー(string view)、または入出力ストリーム(iostream)クラスを特定の文字コンテナ型 C に適用するために、その型と関連する文字特性クラス XcharT および traits パラメータとして文字列、文字列ビュー、または入出力ストリームテンプレートに渡します。
    X::char_typeC と同じ型でない場合、そのプログラムは不正な形式(ill-formed)となります。

これらの定義により、C++の文字列ライブラリにおいて、文字データの取り扱いが統一的かつ効率的に行えるようになります。特に、異なる文字型に対して一貫した操作を提供するための基盤が整えられています。

23.3 String view classes[編集]

23.3 String view classes (string.view)

このセクションでは、C++標準ライブラリの文字列ビュークラスについて説明します。文字列ビューは、一定の連続した文字列(char-likeオブジェクト)のシーケンスを参照するためのクラスです。

23.3.1 General (string.view.general)[編集]

概要[編集]

  1. クラステンプレート basic_string_view
    クラステンプレート basic_string_view は、一定の連続した char-like オブジェクトのシーケンスを参照するオブジェクトを記述します。このシーケンスの最初の要素は位置0にあります。
    basic_string_view オブジェクトが保持する char-like オブジェクトの型は charT として示されます。
  2. 暗黙的な変換と利用
    ライブラリは、const charT*std::basic_string<charT, ...> から std::basic_string_view<charT, ...> への暗黙的な変換を提供します。これにより、文字列のシーケンスが期待される場所で std::basic_string_view<charT> を非テンプレートパラメータとして受け入れることができます。
    ユーザー定義の型も自分自身の暗黙的な変換を std::basic_string_view<charT> に定義することで、これらの関数と相互運用することができます。

詳細な説明[編集]

  1. basic_string_view クラスの利点
    文字列ビューは、コピーを作成することなく既存の文字列データを参照する軽量な方法を提供します。これにより、パフォーマンスが向上し、メモリ使用量が削減されます。
  2. charT の指定
    basic_string_viewcharT の型を指定することで、異なる型の文字列を一貫して取り扱うことができます。これには char, char8_t, char16_t, char32_t, wchar_t などが含まれます。
  3. 暗黙的な変換の利用シナリオ
    関数が std::basic_string_view<charT> を受け入れることで、文字列リテラル、Cスタイルの文字列、標準の std::basic_string など、さまざまな文字列ソースからデータを簡単に受け取ることができます。

このセクションの内容により、C++の文字列ビュークラスがどのように定義され、どのように使用されるかを理解することができます。これにより、効率的で柔軟な文字列操作が可能になります。

23.4 String classes[編集]

23.4 String classes (string.classes)

このセクションでは、C++標準ライブラリにおける文字列クラスについて説明します。特に、さまざまな型の文字列を扱うための基本的なクラステンプレートと、それに関連する型定義について詳述しています。

23.4.1 General (string.classes.general)[編集]

概要[編集]

  1. ヘッダー <string> とクラステンプレート basic_string
    ヘッダー <string> には、basic_string クラステンプレートが定義されています。このクラスは、可変長の char-like オブジェクトのシーケンスを操作するためのものです。
    basic_string クラステンプレートは、さまざまな型の文字列を取り扱うために特殊化されています。
  2. typedef名
    以下の5つの typedef名が定義されており、それぞれ特定の basic_string の特殊化を示しています:
    string: basic_string<char> の別名
    u8string: basic_string<char8_t> の別名
    u16string: basic_string<char16_t> の別名
    u32string: basic_string<char32_t> の別名
    wstring: basic_string<wchar_t> の別名

詳細な説明[編集]

  1. basic_string クラステンプレート
    basic_string クラスは、可変長の文字列を効率的に管理するために設計されています。動的メモリ管理、文字列操作、検索、比較など、多くの便利な機能を提供します。
  2. 特定の文字型の取り扱い
    basic_string クラスは、さまざまな文字型を扱うためにテンプレート化されています。これにより、char, char8_t, char16_t, char32_t, wchar_t などの異なる文字型の文字列を一貫して操作することができます。
    特定の型に対応する文字列クラスは、typedef名を使用して簡単に利用できます。例えば、std::stringstd::basic_string<char> を指し、std::u16stringstd::basic_string<char16_t> を指します。
  3. 利便性と互換性
    basic_string クラスとその特殊化は、多くの文字列操作をサポートしており、C++プログラムで広く使用されています。これにより、文字列操作がシンプルかつ効率的に行えるようになっています。

このセクションの内容により、C++の文字列クラスがどのように定義され、どのように使用されるかを理解することができます。basic_string クラステンプレートとその特殊化は、柔軟かつ強力な文字列操作を提供します。

23.5 Null-terminated sequence utilities[編集]

23.5 Null-terminated sequence utilities (c.strings)

このセクションでは、C++標準ライブラリのNULL終端シーケンスユーティリティについて説明します。NULL終端シーケンスとは、通常の文字列が \0 で終わるものを指し、C言語とC++の両方で広く使用されています。

23.5.1 Header <cctype> synopsis (cctype.syn)[編集]

概要[編集]

 
namespace std {
    int isalnum(int c);
    int isalpha(int c);
    int isblank(int c);
    int iscntrl(int c);
    int isdigit(int c);
    int isgraph(int c);
    int islower(int c);
    int isprint(int c);
    int ispunct(int c);
    int isspace(int c);
    int isupper(int c);
    int isxdigit(int c);
    int tolower(int c);
    int toupper(int c);
}
  1. ヘッダー <cctype> の内容と意味
    <cctype> ヘッダーは、C標準ライブラリの ctype.h ヘッダーと同じ内容および意味を持ちます。
    ISO C 7.4 を参照。

このヘッダーには、文字の特性を判定するための関数が含まれています。たとえば、isalnum は文字が英数字であるかどうかを判定し、tolower は文字を小文字に変換します。

23.5.2 Header <cwctype> synopsis (cwctype.syn)[編集]

概要[編集]

 
namespace std {
    using wint_t = see below;
    using wctrans_t = see below;
    using wctype_t = see below;
    int iswalnum(wint_t wc);
    int iswalpha(wint_t wc);
    int iswblank(wint_t wc);
    int iswcntrl(wint_t wc);
    int iswdigit(wint_t wc);
    int iswgraph(wint_t wc);
    int iswlower(wint_t wc);
    int iswprint(wint_t wc);
    int iswpunct(wint_t wc);
    int iswspace(wint_t wc);
    int iswupper(wint_t wc);
    int iswxdigit(wint_t wc);
    int iswctype(wint_t wc, wctype_t desc);
    wctype_t wctype(const char* property);
    wint_t towlower(wint_t wc);
    wint_t towupper(wint_t wc);
    wint_t towctrans(wint_t wc, wctrans_t desc);
    wctrans_t wctrans(const char* property);
}
#define WEOF see below
  1. ヘッダー <cwctype> の内容と意味
    <cwctype> ヘッダーは、C標準ライブラリの wctype.h ヘッダーと同じ内容および意味を持ちます。
    ISO C 7.30 を参照。

このヘッダーは、ワイド文字の特性を判定するための関数を提供します。たとえば、iswalpha はワイド文字がアルファベットであるかどうかを判定します。

23.5.3 Header <cstring> synopsis (cstring.syn)[編集]

概要[編集]

 
namespace std {
    using size_t = see 17.2.4;
    void* memcpy(void* s1, const void* s2, size_t n);
    void* memmove(void* s1, const void* s2, size_t n);
    char* strcpy(char* s1, const char* s2);
    char* strncpy(char* s1, const char* s2, size_t n);
    char* strcat(char* s1, const char* s2);
    char* strncat(char* s1, const char* s2, size_t n);
    int memcmp(const void* s1, const void* s2, size_t n);
    int strcmp(const char* s1, const char* s2);
    int strcoll(const char* s1, const char* s2);
    int strncmp(const char* s1, const char* s2, size_t n);
    size_t strxfrm(char* s1, const char* s2, size_t n);
    const void* memchr(const void* s, int c, size_t n);
    void* memchr(void* s, int c, size_t n);
    const char* strchr(const char* s, int c);
    char* strchr(char* s, int c);
    size_t strcspn(const char* s1, const char* s2);
    const char* strpbrk(const char* s1, const char* s2);
    char* strpbrk(char* s1, const char* s2);
    const char* strrchr(const char* s, int c);
    char* strrchr(char* s, int c);
    size_t strspn(const char* s1, const char* s2);
    const char* strstr(const char* s1, const char* s2);
    char* strstr(char* s1, const char* s2);
    char* strtok(char* s1, const char* s2);
    void* memset(void* s, int c, size_t n);
    char* strerror(int errnum);
    size_t strlen(const char* s);
}
#define NULL see 17.2.3
  1. ヘッダー <cstring> の内容と意味
    <cstring> ヘッダーは、C標準ライブラリの string.h ヘッダーと同じ内容および意味を持ちます。
  2. 関数 strerrorstrtok
    これらの関数はデータレースを避ける必要はありません。
  3. 関数 memcpymemmove
    これらの関数はシグナルセーフであり、コピー先の領域に文字列をコピーする前に暗黙的にオブジェクトを作成します。
  4. 注意事項
    strchr, strpbrk, strrchr, strstr, および memchr の関数は、このドキュメントでは異なるシグネチャを持っていますが、C標準ライブラリと同じ動作をします。
    ISO C 7.24 を参照。

このヘッダーには、メモリ操作や文字列操作のための多くの便利な関数が含まれています。たとえば、memcpy はメモリブロックをコピーし、strcpy はNULL終端の文字列をコピーします。

23.5.4 Header <cwchar> synopsis (cwchar.syn)[編集]

概要[編集]

 
namespace std {
    using size_t = see 17.2.4;
    using mbstate_t = see below;
    using wint_t = see below;
    struct tm;
    int fwprintf(FILE* stream, const wchar_t* format, ...);
    int fwscanf(FILE* stream, const wchar_t* format, ...);
    int swprintf(wchar_t* s, size_t n, const wchar_t* format, ...);
    int swscanf(const wchar_t* s, const wchar_t* format, ...);
    int vfwprintf(FILE* stream, const wchar_t* format, va_list arg);
    int vfwscanf(FILE* stream, const wchar_t* format, va_list arg);
    int vswprintf(wchar_t* s, size_t n, const wchar_t* format, va_list arg);
    int vswscanf(const wchar_t* s, const wchar_t* format, va_list arg);
    int vwprintf(const wchar_t* format, va_list arg);
    int vwscanf(const wchar_t* format, va_list arg);
    int wprintf(const wchar_t* format, ...);
    int wscanf(const wchar_t* format, ...);
    wint_t fgetwc(FILE* stream);
    wchar_t* fgetws(wchar_t* s, int n, FILE* stream);
    wint_t fputwc(wint_t c, FILE* stream);
    int fputws(const wchar_t* s, FILE* stream);
    int fwide(FILE* stream, int mode);
    wint_t getwc(FILE* stream);
    wint_t getwchar();
    wint_t putwc(wchar_t c, FILE* stream);
    wint_t putwchar(wchar_t c);
    wint_t ungetwc(wint_t c, FILE* stream);
    double wcstod(const wchar_t* nptr, wchar_t** endptr);
    float wcstof(const wchar_t* nptr, wchar_t** endptr);
    long double wcstold(const wchar_t* nptr, wchar_t** endptr);
    long int wcstol(const wchar_t* nptr, wchar_t** endptr, int base);
    long long int wcstoll(const wchar_t* nptr, wchar_t** endptr, int base);
    unsigned long int wcstoul(const wchar_t* nptr, wchar_t** endptr, int base);
    unsigned long long int wcstoull(const wchar_t* nptr, wchar_t** endptr, int base);
    wchar_t* wcscpy(wchar_t* s1, const wchar_t* s2);
    wchar_t* wcsncpy(wchar_t* s1, const wchar_t* s2, size_t n);
    wchar_t* wcscat(wchar_t* s1, const wchar_t* s2);
    wchar_t* wcsncat(wchar_t* s1, const wchar_t* s2, size_t n);
    int wcscmp(const wchar_t* s1, const wchar_t* s2);
    int wcsncmp(const wchar_t* s1, const wchar_t* s2, size_t n);
    int wcscoll(const wchar_t* s1, const wchar_t* s2);
    size_t wcsxfrm(wchar_t* s1, const wchar_t* s2, size_t n);
    size_t wcslen(const wchar_t* s);
    const wchar_t* wcschr(const wchar_t* s, wchar_t c);
    wchar_t* wcschr(wchar_t* s, wchar_t c);
    size_t wcscspn(const wchar_t* s1, const wchar_t* s2);
    const wchar_t* wcspbrk(const wchar_t* s1, const wchar_t* s2);
    wchar_t* wcspbrk(wchar_t* s1, const wchar_t* s2);
    const wchar_t* wcsrchr(const wchar_t* s, wchar_t c);
    wchar_t* wcsrchr(wchar_t* s, wchar_t c);
    size_t wcsspn(const wchar_t* s1, const wchar_t* s2);
    const wchar_t* wcsstr(const wchar_t* s1, const wchar_t* s2);
    wchar_t* wcsstr(wchar_t* s1, const wchar_t* s2);
    wchar_t* wcstok(wchar_t* s1, const wchar_t* s2, wchar_t** ptr);
    wchar_t* wmemset(wchar_t* s, wchar_t c, size_t n);
    wchar_t* wmemcpy(wchar_t* s1, const wchar_t* s2, size_t n);
    wchar_t* wmemmove(wchar_t* s1, const wchar_t* s2, size_t n);
    int wmemcmp(const wchar_t* s1, const wchar_t* s2, size_t n);
    const wchar_t* wmemchr(const wchar_t* s, wchar_t c, size_t n);
    wchar_t* wmemchr(wchar_t* s, wchar_t c, size_t n);
    size_t mbrlen(const char* s, size_t n, mbstate_t* ps);
    size_t mbrtowc(wchar_t* pwc, const char* s, size_t n, mbstate_t* ps);
    int mbsinit(const mbstate_t* ps);
    size_t mbsrtowcs(wchar_t* dst, const char** src, size_t len, mbstate_t* ps);
    size_t wcrtomb(char* s, wchar_t wc, mbstate_t* ps);
    size_t wcsrtombs(char* dst, const wchar_t** src, size_t len, mbstate_t* ps);
}
#define WEOF see 17.2.3
  1. ヘッダー <cwchar> の内容と意味
    <cwchar> ヘッダーは、C標準ライブラリの wchar.h ヘッダーと同じ内容および意味を持ちます。
  2. 注意事項
    wint_t 型は、ワイド文字の操作をサポートするために使用されます。
    mbstate_t 型は、マルチバイト状態を表現するために使用されます。
    ISO C 7.29 を参照。

このヘッダーには、ワイド文字およびマルチバイト文字の操作をサポートするための関数が含まれています。たとえば、wcslen はワイド文字列の長さを計算し、mbsrtowcs はマルチバイト文字列をワイド文字列に変換します。

23.5.5 Header <cuchar> synopsis (cuchar.syn)[編集]

概要[編集]

 
namespace std {
    using size_t = see 17.2.4;
    using mbstate_t = see 17.2.4;
    using char16_t = see 17.2.1;
    using char32_t = see 17.2.1;
    size_t c16rtomb(char* s, char16_t c16, mbstate_t* ps);
    size_t mbrtoc16(char16_t* pc16, const char* s, size_t n, mbstate_t* ps);
    size_t c32rtomb(char* s, char32_t c32, mbstate_t* ps);
    size_t mbrtoc32(char32_t* pc32, const char* s, size_t n, mbstate_t* ps);
}
  1. ヘッダー <cuchar> の内容と意味
    <cuchar> ヘッダーは、C標準ライブラリの uchar.h ヘッダーと同じ内容および意味を持ちます。
  2. 注意事項
    char16_t および char32_t 型は、UTF-16およびUTF-32文字を表現するために使用されます。
    ISO C 7.28 を参照。

このヘッダーには、UTF-16およびUTF-32文字とマルチバイト文字との間の変換を行うための関数が含まれています。たとえば、c16rtomb はUTF-16文字をマルチバイト文字に変換し、mbrtoc16 はマルチバイト文字をUTF-16文字に変換します。