[英]validate integer input C++?
我使用!(cin >> input)
來驗證整數輸入,但它不會捕獲其他數據類型,例如浮點數。 相反,它需要第一個整數。 例如:
請輸入一個數字:2.5。
我的錯誤信息出現在這里,它假設循環,但它取代第一個數字。
輸出“2”
如何讓它忽略十進制輸入?
輸入流將任何以符號開頭,后跟至少一個十進制數的內容視為有效的整數輸入。 如果要在包含小數點的十進制輸入上失敗,則需要執行不同的操作。 解決此問題的一種方法是讀取一個整數並查看成功讀取整數后的字符是否為小數點:
if (!(std::cin >> value)
|| std::cin.peek() == std::char_traits<char>::to_int_type('.')) {
deal_with_invalid_input(std::cin);
}
正如托馬斯馬修斯正確指出的那樣,問題並不僅限於浮點數,而是任何前綴為數字后跟非空格的東西(而非EOF:上述解決方案實際上會錯過最后一個有效整數)一個文件,即沒有任何東西,甚至沒有換行符。 要僅讀取整數后跟空格或文件末尾,這樣的內容將按順序排列:
if (!(std:cin >> value)
|| (!std::isspace(std::cin.peek())
&& std::cin.peek() != std::char_traits<char>::eof())) {
deal_with_invalid_input(std::cin);
}
沒有任何方法可以返回已讀取的字符。 由於在許多地方使用它並不是很好,因此將此函數打包到合適的std::num_get<char>
facet並使用相應的std::locale
imbue()
流可能是合理的。 盡管處理代碼的表達式實際上更簡單,但這有點高級。
在驗證之前,您需要閱讀完整的輸入。 您可以使用cin.getline()
或getline()
來執行此操作,然后檢查輸入是否是您想要的。
您正嘗試使用cin讀取不同類型的值。
istream
重載>>
運算符以匹配您期望輸入的數據類型,而cin
是istream
類的實例。
當期望的類型是整數時,它將消耗字符直到可以轉換為整數的字符串,並將剩余的字符留在流中以供稍后解析。 浮點值或其他簡單類型也會發生同樣的情況。 有關操作員及其支持的類型的詳細信息,請參閱此參考頁 。 最重要的是,如果你想要一個整數值,但是期望輸入的浮點值,你必須使用你想要從輸入中解析的正確類型的值(這里是float),並在稍后進行任何所需的轉換(這里使用trunc
, floor
, ceil
或任何符合您需求的舍入函數)。
這是一個簡單的例子:
#include <iostream>
#include <string>
using namespace std;
int main() {
float f;
string str;
cout << "please enter a float :";
cin >> f;
cout << "value entered : " << f << endl;
cout << "stream error : "
<< (cin.fail() ? "yes" : "no")
<< endl;
cin >> str;
cout << "remaining data : " << str << endl;
}
這個非常簡單的程序演示了在istream上使用>>
運算符,特別是預期的浮點值。 對於以下輸入:“1.2345Z6789”(注意數字中間的Z ),程序將解析值“1.2345”並在輸入緩沖區中保留“Z6789”,可用於后續讀取。
如果將f
的類型從float
替換為int
,則在同一輸入上的程序將讀取值“1”,並在輸入緩沖區中保留“.2345Z6789”。
注意:在您的代碼中,您正在使用!
運算符來測試流的狀態,這相當於我在我的例子中使用的fail
方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.