int main()
{
for (int i = 0; i < 4; ++i)
{
cout << "Please enter Employee #" << (i+1) << "'s" << " name: ";
cin.ignore();
getline(cin, employee[i].employeeName);
cout << "Please enter Employee #" << (i+1) << "'s hours worked: ";
cin >> employee[i].hoursWorked;
cout << "Please enter Employee #" << (i+1) << "'s hourly rate: ";
cin >> employee[i].hourlyRate;
cout << "Please enter Employee #" << (i+1) << "'s Federal Tax Rate: ";
cin >> employee[i].fedtaxRate;
cout << "Please enter Employee #" << (i+1) << "'s State Tax Rate: ";
cin >> employee[i].statetaxRate;
cout << endl;
}
Как следует из названия, в настоящее время у меня есть cin.ignore();
чтобы помочь с полным именем, таким как «Баркли, Чарльз» (он отлично справляется, за исключением того, что усекает первый символ, оставляя нам «Аркли, Чарльз» при печати), но когда я удаляю cin.ignore();
Как и в 99% вопросов на StackOverflow, на которые даны ответы, ничего не происходит. Фактически, это даже ухудшается: во втором цикле он возьмет вторую строку второго цикла и поместит его в первую строку второго цикла. Это просто беспорядок. Ах, и cin.getline
тоже не работает. Я попробовал это в сочетании с cin.sync
и никаких кубиков. Обычная простая старая ваниль cin >>
вызывает ту же вторую строку в первой строке проблемы. Я не знаю что делать. Я не нашел ТАКУЮ статью, которая покрывает этот (казалось бы) крайний случай. Спасибо за помощь.
Как и во многих вопросах ввода, проблема существует, потому что вы смешиваете ввод на основе строки и элемента.
Что произойдет, так это то, что финал cin >> employee[i].statetaxRate;
оставит указатель потока, указывающий на позицию, сразу после последнего действительного символа его типа.
Вероятно, это будет символ новой строки в конце строки, поэтому, когда вы вернетесь, чтобы получить следующее имя (без cin.ignore
), это будет читаться как пустая строка.
Вы можете подумать, что можете это исправить, разместив cin.ignore
в конце цикла, но вы можете столкнуться с другими проблемами с этим. В частности, поскольку эта форма просто пропускает один символ, введите:
123<space><newline>
будет просто пропустить <space>
и у вас будет точно такая же проблема.
Быстрое решение — просто прочитать всю оставшуюся часть строки примерно так (в конце цикла):
{
std::string junk;
getline(cin, junk);
}
и это подготовит входной поток, так что вы находитесь в начале следующей строки.
Другая возможность (и это предпочтительнее с момента первого ввода abc
где он ожидает, что число будет вызывать у вас горе), чтобы прочитать все ваши элементы в виде строк, а затем использовать обработку строк, чтобы поместить их в числовые переменные, что-то вроде strtod()
,
Других решений пока нет …