[英]Preventing implicit conversion in C++
我要求用戶輸入整數,我不想執行代碼,除非它是嚴格的整數。
int x;
if(cin >> x)
例如,如果用戶輸入上面的double,則if語句將執行,並隱式轉換為整數。 相反,我根本不希望代碼執行。
我怎么能阻止這個?
那里沒有轉換。 如果用戶輸入分數(沒有double
),則>>
提取將在小數點處停止。
int main() {
int x;
std::cin >> x;
std::cout << std::cin.rdbuf();
}
input:
123.456
output:
.456
如果要將小數點的存在標記為錯誤,則必須執行某些操作以從cin
提取並檢測它。
與C ++流的一個很好的分析策略是getline
你知道你會處理成istringstream
,稱之為s
,然后檢查該s.peek() == std::char_traits<char>::eof()
當你完成。 如果你不使用getline
來提取單個數字,那么peek
可以檢查下一個字符是否是空格(使用std::isspace
)而不從流中消耗該字符。
檢查輸入結束的最簡潔方法可能是使用std::istream::sentry
,雖然它有些深奧。
if ( ! ( std::cin >> x ) || std::istream::sentry( std::cin ) ) {
std::cerr << "Invalid or excessive input.\n";
}
這會在輸入結束時占用空間。 sentry
還提供了一個noskipws
選項,以避免占用空間。
if ( ! ( std::cin >> x ) || std::istream::sentry( std::cin, true ) ) {
std::cerr << "Invalid or excessive input. (No space allowed at end!)\n";
}
這似乎有效。 它忽略了空白,我不知道你是否還可以。
string s;
cin >> s;
stringstream ss(s);
int x;
if (! (ss >> x))
{
cerr << "You didn't enter an integer." << endl;
return -1;
}
string temp;
ss >> temp;
if (! temp.empty())
{
cerr << "You didn't enter an integer." << endl;
return -1;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.