2017-02-28 68 views
-3
{ 

int n; 
cin>>n; 
cout<< n; 

} 

輸出是0any alphabet or special character被給定爲輸入。混亂在CIN的功能與INT dataype

在C不是這種情況,當我用scanf();printf()。它打印相應的ASCII值。

請解釋爲什麼會發生這種情況?

+0

你檢查了的文檔'>>'的int重載?注意,C!= C++。 – Carcigenicate

+1

您可以在輸入值後檢查cin的狀態。 –

+0

@πάνταῥεῖcout << cin.fail();給1;只有當它的數量爲0時。爲什麼它失敗? – MELWIN

回答

0

在C和C++中,輸入整數時,驅動程序輸入函數將讀取數字字符,直到讀取不是數字的字符。例如,"123GHI"的序列應該返回值123

+0

只是問,'return'是在這裏使用的正確術語嗎? –

+0

我相信是這樣,因爲輸入過程是函數,通常函數會返回一個值。 「 –

+0

」*應該**輸出**值123 *「會更準確。輸出值並不總是在函數返回值中,這在'operator >>'中是肯定的,因爲解析值是通過引用參數而不是返回值輸出的。 –

1

請解釋爲什麼會發生這種情況?

std::istream& operator>>(std::istream&, int)documentation它說(重點煤礦):

如果提取失敗(例如,如果輸入一個字母,其中數字預計),值保持爲未修改並設置失敗位。

用於C++ 11碼似乎初始化保證:

如果提取失敗,零被寫入值和failbit被設置。如果提取的結果值太大或太小而不適合值,則寫入std::numeric_limits<T>::max()std::numeric_limits<T>::min(),並設置失敗位標誌。

以爲你運行你的代碼的調試版本

n可能與0自動初始化,但在技術上訪問它是未定義的行爲,因爲它不是在你描述的情況下initalized。

你必須檢查的cin狀態後,輸入檢測,如果數字提取過程中的故障發生,或者如果你可以安全地使用現在初始化值:

int n; 
std::cin >> n; 
if(std::cin) { 
    std::cout << n << std::endl; 
} 
else { 
    std::cin.clear(); // Clear the streams fail state 
    std::string dummy; 
    std::cin >> dummy; // Consume the non numeric input 
    std::cout << "Wrong input, '" << dummy << "' is not a number." 
} 
+1

@Quentin THX,我一直在那裏煩惱那個公式。 –

+0

請注意C++ 11及更高版本中的行爲稍有不同:「*如果提取失敗,則將**寫入值**並設置失敗位*。」 –

+0

@remy已採用。 –