C言語「Strings」における`iswspace`関数:詳細解説とサンプルコード


機能

  • ch が空白文字でない場合は、0 を返します。
  • ch が空白文字であれば、非ゼロ値を返します。
  • 引数としてワイド文字 wchar_t ch を受け取ります。

空白文字

iswspace 関数が判定する空白文字は、現在のロケールによって異なります。デフォルトのロケールでは、以下の文字が空白文字として扱われます。

  • 改行 (0x0a'\n')
  • フォームフィード (0x0c'\f')
  • スペース (0x20' ')

使い方

以下の例は、iswspace 関数の基本的な使い方を示しています。

#include <stdio.h>
#include <wchar.h>

int main() {
  wchar_t ch = L' ';'; // セミコロン

  if (iswspace(ch)) {
    printf("%lc は空白文字です。\n", ch);
  } else {
    printf("%lc は空白文字ではありません。\n", ch);
  }

  return 0;
}

このプログラムは、ch が空白文字かどうかを判定し、結果をコンソールに出力します。

  • 詳細については、C 言語の標準ライブラリのリファレンスを参照してください。
  • ワイド文字列を扱うには、wchar_t 型とそれに関連する関数を使用する必要があります。
  • iswspace 関数は、ctype.h ヘッダーファイルで宣言されています。

応用例

iswspace 関数は、以下の用途に使用できます。

  • 入力データの検証
  • 空白文字の削除
  • 単語の区切り判定
  • 文字列のトリミング


文字列のトリミング

この例では、iswspace 関数を使用して、文字列の先頭と末尾にある空白文字を削除します。

#include <stdio.h>
#include <wchar.h>

void trim_whitespace(wchar_t *str) {
  // 文字列の先頭から空白文字を探す
  wchar_t *p = str;
  while (*p && iswspace(*p)) {
    p++;
  }

  // 文字列の末尾から空白文字を探す
  wchar_t *q = str + wcslen(str) - 1;
  while (q >= p && iswspace(*q)) {
    q--;
  }

  // 文字列の長さを更新
  *(q + 1) = L'\0';

  // 先頭ポインタを更新
  str = p;
}

int main() {
  wchar_t str[] = L"  Hello, World!  ";

  // 文字列のトリミング
  trim_whitespace(str);

  // トリミング後の文字列を出力
  printf("%ls\n", str);

  return 0;
}

このプログラムは、まず iswspace 関数を使用して、str 文字列の先頭と末尾にある空白文字を見つけます。その後、空白文字を削除し、文字列の長さを更新します。最後に、トリミング後の文字列をコンソールに出力します。

単語の区切り判定

この例では、iswspace 関数を使用して、文字列中の単語を区切ります。

#include <stdio.h>
#include <wchar.h>

void split_words(wchar_t *str) {
  wchar_t *word_start = str; // 単語の開始位置

  while (*str) {
    // 空白文字が見つかったら、単語を出力
    if (iswspace(*str)) {
      *str = L'\0'; // 単語の終端文字を追加
      printf("%ls ", word_start); // 単語を出力

      // 次の単語の開始位置を更新
      word_start = str + 1;
    }

    str++;
  }

  // 最後の単語を出力
  if (*word_start) {
    printf("%ls\n", word_start);
  }
}

int main() {
  wchar_t str[] = L"This is a string with spaces.";

  // 単語の区切り
  split_words(str);

  return 0;
}

このプログラムは、str 文字列をスキャンし、iswspace 関数を使用して空白文字を見つけます。空白文字が見つかったら、その前の文字列を単語として出力し、次の単語の開始位置を更新します。最後に、すべての単語が出力されます。

空白文字の削除

この例では、iswspace 関数を使用して、文字列からすべての空白文字を削除します。

#include <stdio.h>
#include <wchar.h>

void remove_whitespace(wchar_t *str) {
  wchar_t *dst = str; // 出力先のポインタ

  while (*str) {
    // 空白文字でない場合は、出力先にコピー
    if (!iswspace(*str)) {
      *dst++ = *str;
    }

    str++;
  }

  // 出力先の文字列に終端文字を追加
  *dst = L'\0';
}

int main() {
  wchar_t str[] = L"  Hello World!  ";

  // 空白文字の削除
  remove_whitespace(str);

  // 削除後の文字列を出力
  printf("%ls\n", str);

  return 0;
}

このプログラムは、str 文字列をスキャンし、iswspace 関数を使用して空白文字かどうかを判定します。空白文字でない場合は、出力先の文字列にコピーします。最後に、出力先の文字列に終端文字を追加し、削除後の文字列をコンソールに出力します。

入力データの検証

この例では、iswspace 関数を使用して、ユーザーが入力した文字列が有効な文字列かどうかを検証します。

#include <stdio.h>


以下に、iswspace 関数の代替方法として考えられる方法をいくつか紹介します。

isspace 関数

isspace 関数は、通常の文字列(char 型)中の文字が空白文字かどうかを判定する関数です。ワイド文字列を扱う場合は、isspace 関数と wchar_t 型を組み合わせて使用することができます。

#include <stdio.h>
#include <wchar.h>

int is_whitespace(wchar_t ch) {
  return isspace((int)ch);
}

int main() {
  wchar_t ch = L' '; // セミコロン

  if (is_whitespace(ch)) {
    printf("%lc は空白文字です。\n", ch);
  } else {
    printf("%lc は空白文字ではありません。\n", ch);
  }

  return 0;
}

この例では、isspace 関数を使用して wchar_t 型の文字 ch が空白文字かどうかを判定しています。isspace 関数は通常の文字列(char 型)の引数を受け取るため、wchar_t 型の chint 型に変換してから渡しています。

マクロ

iswspace 関数の代わりに、以下のマクロを使用することができます。

#define is_whitespace(ch) ((ch) == L' ' || (ch) == L'\t' || (ch) == L'\n' || (ch) == L'\f' || (ch) == L'\v')

このマクロは、ch が以下のいずれかの文字であるかどうかを判定します。

  • 垂直タブ (L'\v')
  • フォームフィード (L'\f')
  • 改行 (L'\n')
  • タブ (L'\t')
  • スペース (L' ')

カスタム関数

iswspace 関数の代わりに、独自の関数を作成することもできます。この方法は、より柔軟な判定が必要な場合に役立ちます。

#include <stdio.h>
#include <wchar.h>

int is_whitespace(wchar_t ch) {
  // 判定ロジックを記述

  return 0; // 真偽値を返す
}

int main() {
  wchar_t ch = L' '; // セミコロン

  if (is_whitespace(ch)) {
    printf("%lc は空白文字です。\n", ch);
  } else {
    printf("%lc は空白文字ではありません。\n", ch);
  }

  return 0;
}

この例では、is_whitespace 関数の空の定義を示しています。実際の判定ロジックは、必要な要件に合わせて記述する必要があります。

正規表現

iswspace 関数の代わりに、正規表現を使用することができます。正規表現は、より複雑なパターンを判定するのに適しています。

#include <stdio.h>
#include <regex.h>

int is_whitespace(wchar_t *str) {
  regex_t reg;
  int err;

  // 正規表現をコンパイル
  err = regcomp(&reg, L"[ \t\n\f\v]", REG_EXTENDED);
  if (err != 0) {
    return 0; // エラー処理
  }

  // 正規表現に一致するかどうかを判定
  err = regexec(&reg, str, 0, NULL, 0);
  regfree(&reg); // 正規表現の解放

  return err == 0; // 真偽値を返す
}

int main() {
  wchar_t str[] = L"  Hello World!  ";

  if (is_whitespace(str)) {
    printf("%ls は空白文字のみで構成されています。\n", str);
  } else {
    printf("%ls は空白文字を含む文字列です。\n", str);
  }

  return 0;
}

この例では、[ \t\n\f\v] という正規表現を使用して、str 文字列が空白文字のみで構成されているかどうかを判定しています。