2014-02-17 78 views
1

我正在編譯下面的程序,並且我知道char&的提取器會繼續提取字符,即使它是空白字符。我禁止了前導空白字符的跳過,期望前進的讀取嘗試失敗(因爲格式化的提取在空白處停止),但當它成功時會感到驚訝。爲什麼std :: operator >>(istream&,char&)會提取空格?

#include <iostream> 
#include <sstream> 

int main() 
{ 
    std::istringstream iss("a b c"); 
    char a, b, c; 

    iss >> std::noskipws; 

    if (iss >> a >> b >> c) 
    { 
     std::cout <<  "a = \"" << a 
        << "\"\nb = \"" << b 
        << "\"\nc = \"" << c << '\n'; 
    } 
} 

輸出:

a = "a" 
b = " " 
c = "b" 

正如可以從輸出中看到,b給予"a""b"之間的空間的值;和c被賦予以下字符"b"。我期待bc都沒有任何價值,因爲提取應該由於空白引導而失敗。這種行爲的原因是什麼?

+0

http://www.cplusplus.com/reference/ios/skipws/ – Gasim

+0

根據資源,它會忽略空白(不失敗),直到非空白字符到位。編輯:你正在使用noskipws代表「不跳過空白」,它給你一個預期的結果。 – Gasim

+0

檢查一下這個例子(同樣也對3條評論感到抱歉,它很難從手機上寫下來):http://www.cplusplus.com/reference/ios/noskipws/ – Gasim

回答

1

在IOStreams中,字符幾乎沒有格式要求。字符序列中的任何和所有字符都是提取的有效候選字符。對於使用數字構面的提取器,提取被定義爲停止在空白處。然而,charT&的提取器直接在緩衝區上工作,可以通過致電rdbuf()->sbumpc()不加區別地返回下一個可用字符。

不要認爲此行爲擴展到指向字符的指針的提取器,因爲提取會明確定義爲停止在空白處。

相關問題