3

我需要实现一个循环,我必须询问用户,然后检查输入的有效性(在这种情况下,有必要打印一个无效的数字)。实施它的更好方法是什么?

我们的编程教授不允许我们使用breakfor(;;)正如他所说,这是一种不好的做法。那是对的吗?

示例 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;
}
4

4 回答 4

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;
}
于 2012-10-25T17:55:38.007 回答
2

在您的情况下,第二个构造(do..while)对于读者查看代码的作用是最直观的,这很重要。

第一个还不错,最后一个很差,通常在迭代次数有限且预先设置了限制的情况下使用“for”构造。它不一定是,但直观地说,这就是使用 for 循环的方式。

(顺便说一句,如果用户输入的字符串不是数字,则必须清除 cin 上的失败标志,但这并不是这里真正要问的问题)。

于 2012-10-25T17:42:14.667 回答
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) 则更为明显。

于 2012-10-25T17:37:57.023 回答
0

他们都工作。就像 Shmiddty 所说的那样,for(;;) 不是一个好的编程习惯。我会像示例 2 那样做,但我不是专业程序员。

于 2012-10-25T17:36:39.543 回答