2015-08-07 2 views
0

У меня проблема с этим кодом. Кажется, что все работает нормально, но когда вы вводите что-то вроде этого: 123aaaddfa123, тогда программа примет это как двойное значение. Любые идеи, чтобы избежать этой проблемы? Спасибо.C++ - cin позволяет сохранять нечисловые в двойном типе

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; 
} 

}

+0

Вы можете прочитать строку 'string' и преобразовать ее, используя [' std :: stod() '] (http://en.cppreference.com/w/cpp/string/basic_string/stof), что исключение в таком случае. –

+0

@ πάνταῥεῖ Действительно? Согласно cppreference, 'std :: stod' принимает ** как можно больше символов **, чтобы сформировать допустимое представление с плавающей запятой и преобразует их в значение с плавающей запятой. – Lingxi

+0

Посмотрите [здесь] (http://stackoverflow.com/a/10349885/3410935) – Glapa

ответ

0

Это общий вопрос с входными или преобразования функций. Оператор ввода >> будет принимать как можно больше символов и оставить оставшуюся часть для последнего чтения. Это дизайн потому, что она позволяет читать samelines как 12.50$ или 12.50 $ с или без пробела между числом и символом валюты:

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

Если в вас particuliar случае, если вы хотите, чтобы быть в состоянии обнаружить дополнительные символы после числового значения вы должны прочитать все это как строку. Если в строке ориентированного ввода, вы должны использовать 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 
}