2015-09-19 57 views
6

我有这样的循环,现在,在数字读取,并将其输出的十进制,八和十六进制:丢弃除了数字字母与CIN

while(1) { 
    if (cin >> n) 
    cout << internal << setfill(' ') << setw(10) << dec << n << internal << setw(12) << oct << n << internal << setw(9) << hex << uppercase << n << endl; 
    if (cin.fail()) { 
     break; 
    } 
} 

但是,如果我尝试放弃那些不能与数字输入这不会在输入后读取字母:

if (cin.fail()) { 
    cin.ignore(); 
} 

如何放弃输入但能够在稍后读取其他输入?

样品输入:

23 
678 786 abc 
7777 

预期输出:十二月,月,十六进制


23   27  17 
    678  1246  2A6 
    786  1422  312 
    7777  17141  1E61 
+0

您错过了对'cin.clear()'的调用。你需要清除'failbit'。只要设置了,所有操作立即失败。 –

回答

2

你需要消耗从cin违规内容,并重置错误状态。只要设置了failbit,所有输入操作都将立即失败。

while(1) { 
if (cin >> n) 
    cout << internal << setfill(' ') << setw(10) << dec << n << internal << setw(12) << oct << n << internal << setw(9) << hex << uppercase << n << endl; 
else { 
    if (cin.eof()) 
     break; 
    cin.clear();    // Reset the error state 
    std::string dummy; 
    if (!(cin >> dummy))  // Consume what ever non-integer you encountered 
     break; 
    } 
} 

或者,你可以随时读取std::string,然后尝试解析了一些与std::stoi

for (std::string word; std::cin >> word;) { 
    try { 
     int n = std::stoi(word); 
     // You output logic here 
    } 
    catch (std::exception&) {} 
} 

但是,这可能会过度使用异常,你声明无效的输入并不例外。好处在于,“手工”意味着减少逻辑。