2016-03-03 115 views
1

我想在給出意外輸入時測試std::cin的行爲。爲什麼std::cin以非確定性方式返回0和2.07386e-317?std :: cin對於意外輸入的行爲

#include <iostream> 

using namespace std; 

int main(){ 
    double foo, bar; 
    while(cin.good() and cin >> foo >> bar){  
     cout << foo << " " << bar << endl; 
    } 
    if (cin.eof()){ 
      cout << "Ooops, EOF encountered.\n"; 
    } 
    else{ 
     cout << "Something weird happened!\n"; 
     cout << foo << " " << bar << endl; 
    } 
    return 0; 
} 

每當我打字,

<a_number> <non-number> 

輸出爲<a_number> 0

每當我打字,

<non-number> <anything> 

輸出爲0 2.07386e-317


我通過增加輸入的數目至3並試圖確切的代碼,

<non-number> <non-number> <non-number> 

輸出是0 0 2.07353e-317


對於4個輸入,

`<non-number> <non-number> <non-number> <non-number>` 

輸出是0 2.07353e-317 0 2.07353e-317


最後,對於5個輸入,

`<non-number> <non-number> <non-number> <non-number> <non-number>` 

輸出是0 2.07353e-317 2.07353e-317 0 2.07353e-317

我看着the November 2014 working draft of current standart (C++14),不能看到這在§27.4.2,其中窄流對象在解釋任何有用的信息一個令人驚訝的短路。我期望看到std::cin的內部工作細節。我錯過了什麼嗎?

我很好奇行爲的原因。感謝幫助。

+0

使用不確定的未初始化的非靜態局部變量的值不好。嘗試初始化變量,[你會看到](http://melpon.org/wandbox/permlink/peBxVVt3QD7lvLpJ)用於初始化出現的數字。 – MikeCAT

+0

@MikeCAT將所有變量設置爲靜態,並將所有輸出視爲0,作爲其初始值。那麼,看到以前的值是0還是2.07353e-317,這是巧合嗎?謝謝。 – oguzhanunlu

+0

你有沒有使''和'宏(&&)'? –

回答

2

您不應該嘗試在「出現奇怪的事情」的情況下打印變量,因爲這意味着變量提取不成功。從第一個不正確的輸入開始的任何變量都不會被分配。

有關如何跳過錯誤輸入的信息,請參見How to test whether stringstream operator>> has parsed a bad type and skip it

+0

感謝提醒檢查提取後cin對象的狀態!但是,請查看https://ideone.com/QTseTC。結果現在甚至不同。 – oguzhanunlu

+0

爲什麼當出現奇怪的事情時你想打印變量?這意味着變量從未被分配。 – Barmar

+0

我只是好奇std :: cin'd如何對不同的條件作出反應,我認爲,但我仍然不知道讀取輸入的哪個階段在這裏失敗。閱讀完整並檢查完畢後?在讀的時候?等等。讀取失敗是否嚴格意味着不給變量賦值?這實際上是我混淆的原因,因爲我不知道std :: cin的工作原理。你可以參考一個可靠的來源嗎?謝謝。 – oguzhanunlu