Это вопрос, связанный с C ++.
Мне нужно сделать программу, которая читает в вес пользователя / рост. и это все хорошо и модно, но есть проблема, на которой я застрял.
пользователь должен иметь возможность ввести число, а затем единицу измерения сразу после. это может быть в футах / дюймах, метрах или см.
Я получил все это, чтобы работать, но пользователь также должен иметь возможность написать что-то, например, 5 ‘и иметь дополнительные дюймы.
вот проблема, которую я имею:
У меня есть две переменные, которые я использую для ввода пользователя, одна двойная (высота) и одна строка (unitHeight). это прекрасно работает для м и см, но для футов / дюймов мне нужно было добавить еще две, так как пользователю нужно ввести две строки и два числа (для простоты я сохранил их как двойные)
поэтому я использовал оператор if:
if (unitHeight == "'"){
cin >> height2;
cin >> unitHeight2;
}
Теперь единственная проблема, которая сохраняется, заключается в том, что мне нужно сделать так, чтобы, когда пользователь вводит x ‘(x — любое число)
программа не запрашивает дальнейших действий.
это может быть очевидно, и мне, возможно, просто нужно сделать шаг назад, но я обдумывал это некоторое время, и лично я не могу понять это
любая помощь приветствуется.
Что делать, зависит немного от того, какие другие входные данные (если таковые имеются) могут идти после высоты, и как вы хотите обрабатывать ошибки, но для начала:
int height2 = 0;
if (unitHeight == "'" && cin >> height2)
{
if (!(cin >> unitHeight2))
{
std::cerr << "hey, " << height2 << " what? give me units baby!\n";
exit(EXIT_FAILURE);
}
// if we get here, then we have height2 and unitHeight2 to work with...
...
}
else if (cin.eof())
{
// might have hit EOF without inches, that could be legal - depends on your program
...
}
else
{
// saw some non-numeric input when expecting height2 - is that ok?
...
}
После того, как вы опубликовали сообщение, вы добавили комментарий о том, что вы хотите, чтобы этот ввод был введен в одну строку, после чего пользователь может ожидать ввода. Чтобы справиться с этим, окружите приведенный выше код std::string line; if (getline(std::cin, line)) { std::istringstream iss(line); >>above code goes here<< } else { ...couldn't read a line of input...}
,
Отдельно вы говорите:
пользователь должен иметь возможность ввести число, а затем единицу измерения сразу после. это может быть в футах / дюймах, метрах или см. я получил все это на работу
…Я надеюсь на это, но учтите, что это немного сложно, например, при поддержке. 5’11 «и 180см, как cin >> height1 >> unitHeight1
, когда unitHeight1
это std::string
, будет читать «11». Если вы делаете unitHeight1
char
тогда он будет иметь тенденцию читать только «c» из «cm», поэтому ни один из типов не работает для обеих нотаций. Лучше всего прочитать символ, а затем использовать его, чтобы решить, стоит ли читать другой ….
Вы можете сделать что-то подобное:
string height;
cin >> height;
for(int i = 0; i < height.size(); i++) {
if(height[i] == "'"[0]) {
cout << "It's ok!" << endl;
break;
}
}
Читайте stdin по одной строке за раз. Обработайте каждую строку. Если строка содержит второе число (для высоты) и вторую строку (для единицы), то у вас есть спецификация футов + дюймы. В противном случае у вас просто один номер и одна единица.
const int maxLength = 200;
while (true)
{
char line[maxLength+1];
std::cin.getline(line, maxLength);
if ( !cin.good() )
{
break;
}
std::istringstream str(line);
double height1;
std::string unit1;
double height2;
std::string unit2;
bool secondHeightFound = false;
str >> height1 >> unit1 >> height2;
if ( str.good() )
{
str >> unit2;
secondHeightFound = true;
}
}