簡體   English   中英

防止C ++中的隱式轉換

[英]Preventing implicit conversion in C++

我要求用戶輸入整數,我不想執行代碼,除非它是嚴格的整數。

int x;
if(cin >> x)

例如,如果用戶輸入上面的double,則if語句將執行,並隱式轉換為整數。 相反,我根本不希望代碼執行。

我怎么能阻止這個?

那里沒有轉換。 如果用戶輸入分數(沒有double ),則>>提取將在小數點處停止。

http://ideone.com/azdOrO

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM