#string.h

string.hでは主に文字列処理関数とメモリ操作関数が定義されています。

文字列処理関数

次の文字列処理関数の詳細については、「文字列」の章を参照してください。

  • strcpy(): 文字列をコピーします。
  • strncpy(): 長さ制限付きで文字列をコピーします。
  • strcat(): 2 つの文字列を連結します。
  • strncat(): 長さ制限付きで 2 つの文字列を連結します。
  • strcmp(): 2 つの文字列を比較します。
  • strncmp(): 長さ制限付きで 2 つの文字列を比較します。
  • strlen(): 文字列内のバイト数を返します。

strchr()、strrchr()

strchr()strrchr() は両方とも、文字列内の指定された文字を検索するために使用されます。違いは、strchr() は文字列の先頭から検索を開始し、strrchr() は文字列の末尾から検索を開始することです。関数名にある余分な r は逆を意味します。

char* strchr(char* str, int c);
char* strrchr(char *str, int c);

これらはすべて 2 つのパラメータを受け入れます。最初のパラメータは文字列ポインタで、2 番目のパラメータは検索する文字です。

キャラクターが見つかると、探すのをやめて、そのキャラクターへのポインターを返します。見つからない場合は NULL が返されます。

以下に例を示します。

char *str = "こんにちは、世界!";
char *p;

p = strchr(str, ','); // p はカンマの位置を指します。
p = strrchr(str, 'o'); // p はワールド内の o の位置を指します。

strspn()、strcspn()

strspn() は、指定された文字セットに属する文字列の長さを見つけるために使用されます。 strcspn() はその逆で、指定された文字セットに属さない文字列の長さを見つけるために使用されます。

size_t strspn(char* str, const char* accept);
size_t strcspn(char *str, const char *reject);

これら 2 つの関数は 2 つのパラメータを受け入れます。最初のパラメータはソース文字列で、2 番目のパラメータは指定された文字で構成される文字列です。

strspn() は、最初のパラメータの先頭から検索を開始し、指定された文字セット範囲に属さない最初の文字を見つけると、検索を停止し、それまでの文字列の長さを返します。指定された文字セットにない文字がない場合は、最初のパラメータ文字列の長さが返されます。

strcspn() は、指定された文字セット範囲に属する最初の文字を見つけると検索を停止し、それまでの文字列の長さを返します。指定された文字セットの文字が見つからない場合は、最初のパラメータ文字列の長さが返されます。

char str[] = "こんにちは世界";
int n;

n = strspn(str1, "aeiou");
printf("%d\n", n); // n == 0

n = strcspn(str1, "aeiou");
printf("%d\n", n); // n == 1

上記の例では、位置 0 の文字 'h' が指定された文字セット 'aeiou' に属していないため、最初の 'n' は 0 になります。属する文字が先頭に 0 個あることがわかります。指定された文字セットに変換されます。 2 番目の n は 1 です。1 番目の文字 e は指定された文字セット aeiou に属しているため、先頭に指定された文字セットに属さない文字が 1 つあることがわかります。 。

strpbrk()

strpbrk() は、文字列内で指定された文字セット内の任意の文字を検索します。

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

これは 2 つのパラメータを受け入れます。最初のパラメータはソース文字列で、2 番目のパラメータは指定された文字で構成される文字列です。

最初に一致した文字へのポインタを返します。一致する文字が見つからない場合は NULL を返します。

char* s1 = "こんにちは、世界!";
char* s2 = "ダウ!";

char* p = strpbrk(s1, s2);

printf("%s\n", p); // 「ああ、世界よ!」

上の例では、指定された文字セットは「dow!」であり、s1 で最初に一致する文字は「Hello」の「o」であるため、ポインタ p はこの文字を指します。出力する場合は、この文字から文字列の末尾の「o, world!」までが出力されます。

strstr()

strstr() は、別の文字列内の文字列を検索します。

char *strstr(
  const char* str、
  const char* 部分文字列
);

これは 2 つのパラメータを受け入れます。最初のパラメータはソース文字列で、2 番目のパラメータは検索する部分文字列です。

一致が成功すると、ソース文字列内の部分文字列を指すポインタが返されます。一致が失敗した場合は、部分文字列が見つからないことを示す NULL が返されます。

char* str = "機敏な茶色のキツネは怠惰な犬を飛び越えました。";
char* p = strstr(str, "怠惰");

printf("%s\n", p == NULL ? "null": p); // 「怠惰な犬」。

上記の例では、ソース文字列 str 内の部分文字列 lazy を見つけるために strstr() が使用されています。返されたポインターから文字列の末尾までは「lazy Dogs」です。

strtok()

strtok() は、指定された区切り文字に従って文字列を一連のトークンに分解するために使用されます。

char* strtok(c​​har* str, const char* delim);

これは 2 つのパラメータを受け入れます。最初のパラメータは分割する文字列で、2 番目のパラメータは指定された区切り文字です。

最初に分解されたトークンへのポインタを返し、トークンの末尾の区切り文字を文字列終了フラグ \0 に置き換えます。分解するトークンがない場合は、NULL を返します。

すべてのトークンを走査したい場合は、ループ内で呼び出す必要があります。以下の例を参照してください。

strtok() の最初のパラメータが NULL の場合、最後の strtok() 分解の最後から分解を続けることを意味します。

#include <stdio.h>
#include <文字列.h>

int main(void) {
  char string[] = "これは 7 つのトークンを含む文です";
  char* tokenPtr = strtok(string, " ");

  while (tokenPtr != NULL) {
    printf("%s\n", tokenPtr);
    tokenPtr = strtok(NULL, " ");
  }
}

上記の例では、ソース文字列をスペースに従ってトークンに分解します。その出力は次のとおりです。

これ
は
ある
文
と
7
トークン

strtok() は元の文字列を変更し、すべての区切り文字を文字列の終わりの文字 \0 に置き換えることに注意してください。したがって、元の文字列のコピーを作成し、このコピーに対して strtok() を実行する方がよいでしょう。

strcoll()

strcoll() は、ローカリゼーション設定を有効にした 2 つの文字列を比較するために使用されます。使い方は基本的に strcmp() と同じです。

int strcoll(const char *s1, const char *s2);

以下の例を参照してください。

setlocale(LC_ALL, "");

// レポート é > f
printf("%d\n", strcmp("é", "f"));

// レポート é < f
printf("%d\n", strcoll("é", "f"));

上の例では、アクセント付きの éf を比較しています。strcmp() は、éf より大きいことを返しますが、strcoll() は、éf より前にあることを正しく識別します。したがって、「f」よりも小さくなります。比較する前に、setlocale(LC_ALL, "") を使用してローカリゼーション設定を有効にする必要があることに注意してください。

strxfrm()

strxfrm() は、ローカライズされた文字列を strcmp() を使用して比較できる形式に変換します。これは、strcoll() 内の操作の最初の部分に相当します。

size_t strxfrm(
  char * s1 を制限、
  const char * s2 を制限、
  サイズ_t n
);

3 つのパラメータを受け取り、2 番目のパラメータ s2strcmp() を使用して比較できる形式に変換し、結果を最初のパラメータ s1 に保存します。 3 番目のパラメータ 'n' は、's1' の境界を超えないように書き込まれる文字数を制限するために使用されます。

末尾のターミネータを除いた、変換された文字列の長さを返します。

最初のパラメータが NULL で、3 番目のパラメータが 0 の場合、実際の変換は実行されず、変換後に必要な文字列長のみが返されます。

次の例では、この関数を使用して strcoll() を単独で実装します。

int my_strcoll(char* s1, char* s2) {
  int len1 = strxfrm(NULL, s1, 0) + 1;
  int len2 = strxfrm(NULL, s2, 0) + 1;

  char *d1 = malloc(len1);
  char *d2 = malloc(len2);

  strxfrm(d1, s1, len1);
  strxfrm(d2, s2, len2);

  int 結果 = strcmp(d1, d2);

  フリー(d2);
  フリー(d1);

  結果を返します。
}

上記の例では、変換された記憶領域が比較対象の 2 つのローカライズされた文字列に最初に割り当てられ、strxfrm() を使用してそれらを比較可能な形式に変換し、次に strcmp() を使用して比較します。

strerror()

strerror() 関数は、特定のエラーの説明文字列を返します。

char *strerror(int errornum);

その引数は、errno.h で定義されるエラー番号です。戻り値は説明文字列へのポインタです。

// 出力 そのようなファイルまたはディレクトリはありません
printf("%s\n", strerror(2));

上記例では、エラーNo.2「そのようなファイルまたはディレクトリはありません」の説明文字を出力しています。

次の例はカスタム エラー メッセージです。

#include <stdio.h>
#include <文字列.h>
#include <errno.h>

int main(void) {
  FILE* fp = fopen("NONEXISTENT_FILE.TXT", "r");

  if (fp == NULL) {
    char* errmsg = strerror(errno);
    printf("ファイルを開くときにエラー %d: %s\n", errno, errmsg);
  }
}

上記の例では、現在のデフォルトのエラー メッセージは strerror(errno) を通じて取得されます。ここで、errno は、現在のエラー番号を表す errno.h によって定義されたマクロです。次に、カスタマイズされたエラー メッセージを出力します。

メモリ操作機能

以下のメモリ操作機能の詳細については、「メモリ管理」の章を参照してください。

  • memcpy(): メモリコピー関数。
  • memmove(): メモリ コピー関数 (重複は許可されます)。
  • memcmp(): 2 つのメモリ領域を比較します。

memchr()

memchr() は、メモリ領域内で指定された文字を検索するために使用されます。

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

これは 3 つのパラメータを受け入れます。最初のパラメータはメモリ領域へのポインタ、2 番目のパラメータは検索する文字、3 番目のパラメータはメモリ領域のバイト長です。

見つかると検索を停止し、その場所へのポインタを返します。指定したバイト数を確認しても指定した文字が見つからない場合はNULLを返します。

以下に例を示します。

char *str = "こんにちは、世界!";
char *p;

p = memchr(str, '!', 13); // p は感嘆符の位置を指します

memset()

memset() はメモリのセクションを指定された値にフォーマットします。

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

最初のパラメータはメモリ領域の先頭を指すポインタ、2 番目のパラメータは書き込まれる文字値、3 番目のパラメータはフォーマットする必要があるバイト数を示す整数です。最初のパラメータ(ポインタ)を返します。

memset(p, ' ', N);

上記の例では、p は長さ N バイトのメモリ領域を指すポインタです。 memset() はメモリ領域の各バイトを空白文字に書き換えます。

別の例を示します。

文字列1[15] = "BBBBBBBBBBBBBB";

// 出力 bbbbbbBBBBBBB
printf("%s\n", (char*) memset(string1, 'b', 7));

memset() の重要な使い方は、すべての配列メンバーを 0 に初期化することです。

memset(arr, 0, sizeof(arr));

以下は、すべての Struct 構造体を 0 に初期化する例です。

構造体バナナ {
  フロートの熟度。
  char *ピールカラー;
  int グラム;
};

構造体バナナ b;

memset(&b, 0, sizeof b);

b.ripeness == 0.0; // True
b.peel_color == NULL;
b.grams == 0; // True

上記の例では、Struct Banana のインスタンス b のすべてのプロパティが 0 に初期化されます。

その他の機能

void* memset(void* a, int c, size_t n);

size_t strlen(const char* s);

作者: wangdoc

アドレス: https://wangdoc.com/

ライセンス: クリエイティブ・コモンズ 3.0