2012-10-15 43 views
9

我注意到在C++ 11中增加了std::isblank(在<locale>)和std::isblank(在<cctype>)。我發現這page它說Returns true if c is a blank character; that is, a space or a tab.(對於「C」語言環境),所以可能一個空白字符是一個空白字符的子集,但我不明白這個區別的原因,因爲我們有std::isspace。爲什麼std::isblank添加到標準庫?爲什麼在C++ 11中添加了std :: isblank?

UPDATEhere,它看起來像POSIX規範已經推出了「空白」字符類第一,那麼C和C++標準效仿。

+0

有兩個isspace函數。你指的是哪一個? [This one](http://en.cppreference.com/w/cpp/string/byte/isspace)或[this one](http://en.cppreference.com/w/cpp/locale/isspace)? –

+0

@BenjaminLindley:還有兩個'isblank'函數。 –

+0

@BenjaminLindley,當使用相同的語言環境時,他們應該對角色的分類達成一致,所以這與你談論的無關。一個使用當前的語言環境,另一個使用語言環境作爲參數,但他們應該就角色分類達成一致。 –

回答

9

可能是一個空白字符是一個空白字符

絕對的子集的一個子集。 C99 7.4.1.3/2說,「一個標準空白字符或是一個特定字符集的一個,其中isspace爲true」。

它繼續我認爲的動機:「並用於 在一行文本中的單獨單詞」。

isspace對於某些而不是用於分隔文本行內的單詞的字符返回true。主要是換行符。

顯然這是指isspaceisblank<cctype>,而不是你所問的<locale>,但我認爲這沒有什麼區別。我認爲這個標準並沒有明確說明它的含義,但是這兩個參考了「字符類型」的相同列表。

+0

+1我想提供standardese,但我手頭沒有C標準副本,只有C++。 :-P – ildjarn

6

兩者都是區域感知的 - 區別在於每個區域設置的規則,這將在這裏列舉的列表太大(假設有一個單一的,詳盡的列表開始)。

特別感興趣的是默認的C語言環境,對於該行爲如下:

  • isspace返回true空間,進紙,換行,回車,水平製表符,和垂直製表符。
  • isblank返回true僅適用於空間和水平選項卡。
4

原因很簡單,它在C等的一致性應該在C++也一樣,我在加入它的DR指出:

C99加入isblankiswblank<locale.h><locale>不提供任何等同物。

我注意到它是從C++失蹤,我想它增加的原因,是std::regex_traits<char>需要支持一個"blank"字符類等支持,但更易於如果C99 isblank功能可用的原因,否則C++ regex實現需要以某種方式標識「isspace爲真」的特定於語言環境的字符集。使用isblank解決了這個問題。

相關問題