12

C++11にstd::isblank (in <locale>) とstd::isblank (in )が追加されていることに気付きました。(「C」ロケールの場合)というこのページ<cctype>を見つけたので、空白文字は空白文字のサブセットである可能性がありますが、. なぜ標準ライブラリに追加されたのですか?Returns true if c is a blank character; that is, a space or a tab.std::isspacestd::isblank

更新hereに よると、POSIX 仕様が最初に「空白」文字クラスを導入し、次に C および C++ 標準がそれに続いたようです。

4

3 に答える 3

11

おそらく空白文字は空白文字のサブセットです

間違いなくサブセットです。C99 7.4.1.3/2 は、「標準の空白文字、または isspace が true であるロケール固有の文字セットの 1 つです」と述べています。

それは、私が動機であると思うものに続きます:「そして、それはテキスト行内の単語を区切るために使用されます」.

isspaceは、テキスト行内の単語を区切るために使用されていない一部の文字に対して true を返します。主に、改行。

明らかにこれは、あなたが尋ねたものではなく、isspaceのとisblankを指しますが、違いはないと思います。標準が実際に明示的にしているとは思いませんが、2つは同じ「文字タイプ」のリストを参照しています。<cctype><locale>

于 2012-10-15T00:26:46.543 に答える
8

どちらもロケールに対応しています。相違点は各ロケールのルール内にあり、ここで列挙するにはリストが大きすぎます (最初に 1 つの完全なリストがあると仮定します)。

特に興味深いのは、デフォルトの C ロケールで、その動作は次のとおりです。

  • isspaceスペース、フォーム フィード、ライン フィード、キャリッジリターンtrue、水平タブ、および垂直タブを返します。
  • isblanktrueスペースと水平タブのみを返します。
于 2012-10-15T00:16:59.833 に答える
4

理由は簡単です。それは C にあるため、一貫性を保つために C++ にもある必要があります。追加したDRで指摘したように:

C99 にはisblankとが追加されiswblankましたが、同等のものはありません。<locale.h><locale>

C++ に欠落していることに気付いた理由、および追加したかった理由は、文字クラスstd::regex_traits<char>をサポートするために必要なため、C99関数が利用可能であれば"blank"サポートがはるかに簡単になるためです。 「真isblankであるロケール固有の文字セット」。isspaceを使用isblankすると問題が解決します。

于 2012-10-15T11:13:14.940 に答える