我需要实现一个循环,我必须询问用户,然后检查输入的有效性(在这种情况下,有必要打印这是一个无效的数字)。实施它的更好方法是什么?
我们的编程教授不允许我们使用break
和for(;;)
,因为他说,这是一种不好的做法。这是对的吗?
示例1:
int i = 0;
while(i == 0) {
cout << "...: ";
cin >> i;
/*... Loop body ...*/
if (i == 0)
cout << "Not a valid number" << endl;
}
示例2:
int i = 0;
do {
cout << "...: ";
cin >> i;
/*... Loop body ...*/
if (i == 0)
cout << "Not a valid number" << endl;
} while (i == 0) // Better while(true) and use break ?
示例3:
int i = 0;
for ( ;; ) {
cout << "...: ";
cin >> i;
/*... Loop body ...*/
if (i == 0)
cout << "Not a valid number" << endl;
else
break;
}
答案 0 :(得分:2)
在你的情况下,第二个构造(do..while)是读者最容易看到的代码所做的事情,这很重要。
第一个不是那么糟糕,最后一个是差的,“for”构造通常用于预先设置限制的有限次数的迭代。它不一定是,但直观地说就是如何使用for循环。
(顺便说一下,如果用户输入的字符串不是数字,则必须清除cin上的失败标志,但这不是真正的问题。)
答案 1 :(得分:2)
你不需要接受零作为整数吗?最好不要依赖具有特殊含义的输入数字。
如果循环的意义是无限循环,直到任务完成,那么清楚地说while(true)
并没有错。我可能会做更像这样的事情(需要C ++ 11):(或使用boost lexical_cast)
#include <iostream>
#include <string>
#include <stdexcept>
int infini_asker(){
while (true) {
std::cout << "...: ";
std::string tmp;
std::cin >> tmp;
int i;
try{
i=std::stoi(tmp);
}catch(std::invalid_argument){
continue;
}catch(std::out_of_range){
continue;
}
return i;
}
}
int main(){
int num=infini_asker();
std::cout << " got:" <<num << std::endl;
}
答案 2 :(得分:1)
示例1的修改看起来是最好的形式:
while(true) {
cout << "...: ";
cin >> i;
/*... other stuff ...*/
// Do your input validation here:
// Note that it's much better to whitelist what is
// acceptable input as opposed to checking all of the
// possible cases of invalid input
if (...) { // where .. is the condition for valid input
break
}
}
应该为特殊情况保留do-while循环,在这种情况下,您希望得到嵌套逻辑至少执行一次的要点。你可以用do-while做任何事情,你可以用while(...)
for(;;)对于很多程序员来说是不太熟悉的语法(我不知道一年前的含义),而while(true)更明显。
答案 3 :(得分:0)
他们都工作。像Shmiddty说的那样for(;;)不是一个好的编程习惯。我会像例子2那样做,但我不是一个专业的程序员。