2017-01-31 39 views
1
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();, чтобы помочь с принятием в полном имени, как «Баркли, Чарльз» (это делает прекрасную работу, за исключением того, что отсекает первый символ, оставив нас с «Arkley, Чарльз "при печати), но когда я удаляю cin.ignore();, как и 99% ответов на вопросы StackOverflow, которые ответили, ничего не происходит. На самом деле, это даже ухудшается: во втором цикле он займет вторую строку второго цикла и помещает его в первую строку второго цикла. Это просто беспорядок. О, и cin.getline тоже не работает. Я пробовал это в сочетании с cin.sync и без кубиков. Обычный простой старый ваниль cin >> вызывает одну и ту же вторую строку в первой строке. Я не знаю, что делать. Я не нашел статью SO, которая охватывает этот (по-видимому) крайний случай. Спасибо за помощь.getline удаляет первый символ; удаление cin.ignore(); не решает

+0

Предполагая, что вызов 'ignore' должен читать и отбрасывать новую строку после последнего ввода, как насчет того, чтобы поместить его в * конец * цикла? –

+0

Блестящий. Спасибо, чувак. – ZoeVillanova

+0

'getline' делает ** не ** удаляет первый символ. Что-то ** до ** этот звонок удалил. И единственное, что до этого вызова, касающееся 'std :: cin', - это вызов' ignore() '. –

ответ

1

Как и во многих вопросах ввода, проблема возникает из-за того, что вы смешиваете линейный и элементный вход.

Что произойдет, так это то, что окончательный cin >> employee[i].statetaxRate; оставит указатель потока, указывающий на позицию сразу после последнего действительного символа его типа.

Это, скорее всего, будет символом новой строки в конце строки, поэтому, когда вы вернетесь назад, чтобы получить следующее имя (без cin.ignore), оно будет читать это как пустую строку.

Вы можете подумать, что можете исправить это, поставив cin.ignore в конце цикла, но вы можете столкнуться с другими проблемами. В частности, так как эта форма просто пропускает один символ, введя:

123<space><newline> 

просто пропустит <space>, и вы будете иметь точно такой же вопрос.

Быстрое исправление просто прочитать всю остальную часть строки с чем-то вроде (в конце цикла):

{ 
    std::string junk; 
    getline(cin, junk); 
} 

и это будет приготовительный входной поток, так что вы в самом начале следующей строки.


Другая возможность (и это предпочтительнее, так как в первый раз при входе в abc где он ожидает ряд собирается причинить вам горе), чтобы прочитать все ваши детали в виде линий, а затем использовать обработку строки для поместите их в числовые переменные, что-то вроде strtod().