2017-05-08 91 views
-1
do { 
    std::cout << "Enter a valid name" << std::endl; 
    std::cin >> name; 

} while (!validName(name) && std::cout << "It is not a valid name" << std::endl); 

這是一個很好的做法,如果名稱無效,那麼我用這種方式回答一條線?這是檢查用戶輸入的好習慣嗎?

+2

它總是**必須檢查輸入是否成功,例如使用'while(std :: cin >> name){...}'。如果'name'有進一步的限制來構成有效的輸入,這些也應該被檢查。 –

+1

@ChrisK:_「首先使用using命名空間標準;所以你不必添加總是標準」_姆毫無理想地完全相反。 –

回答

0

在循環本身中執行檢查和輸出可能更清晰。你可以通過打破無限循環或繼續一次循環來做到這一點。例如:

do { 
    std::cout << "Enter a valid name" << std::endl; 
    std::cin >> name; 
    if (!validName(name)) { 
     std::cout << "It is not a valid name" << std::endl; 
     continue; 
    } 
} while (false); 

或者相反:

for (;;) { 
    std::cout << "Enter a valid name" << std::endl; 
    std::cin >> name; 
    if (validName(name)) 
     break; 

    std::cout << "It is not a valid name" << std::endl; 
} 

我一般喜歡第二個,因爲它可以很容易地注入反,所以你可以做處理,如果環路一些其它類型的錯誤身體失敗超過一定次數。

for (int attempt = 0; attempt < 3; ++attempt) { 
    std::cout << "Enter a valid name" << std::endl; 
    std::cin >> name; 
    if (validName(name)) 
     break; 

    std::cout << "It is not a valid name" << std::endl; 
} 

if (!validName(name)) { 
    std::cout << "Failed to get a valid name after 3 tries" << std::endl; 
    std::abort(); 
} 
相關問題