C ++ - cin允许在double类型中保存非数字

时间:2015-08-07 08:33:52

标签: c++ double cin

我对此代码有疑问。一切似乎工作正常,但当你键入这样的东西:123aaaddfa123然后程序将接受这个双值。有什么想法可以避免这个问题?谢谢。

int main ()
{
   const char MAX = 5;
   cout << "Weight of your fishes (maximum 5)" << endl;
   double fishes[MAX];
   char count = 0;
   while (count < MAX)
   {
      cout << count + 1 << ". fish: " << endl;
      if (cin >> fishes[count])
          count++;
      else {
          cin.clear();
          if (cin.get() == 'q') //no more fishes = quit
              break;
          while (cin.get() != '\n') //clearing cin buffer
              continue;
      }
   }

if (count > 0) {
    double sum = 0;
    for (int i = 0; i < MAX; ++i) {
        sum += fishes[i];
    }
    cout << "Avarage weight of your " << (int)count << " fishes is: " << sum / count << " KG" << endl;
}

}

1 个答案:

答案 0 :(得分:0)

这是输入或转换功能的常见问题。输入>>运算符将尽可能多地使用字符,并将剩余部分留给上次读取。它是按设计,因为它允许读取相同的行,如12.50$12.50 $,在数字和货币符号之间有或没有空格:

double val;
std::string curr;
std::cin >> val >> curr;

如果在特定情况下您希望能够在数值后检测到额外字符,则必须将整个字符作为字符串读取。如果它在面向行的输入中,则应使用getline,因为字符串输入将在第一个空白字符(空格,制表符等)处停止

假设您有std::string str包含您的输入,您可以执行以下操作:

char *end;
double val = strtod(str.c_str(), &end);
if (*end != 0) {
    // there is something after last character used for the double
}