Когда вы используете >>
для чтения ввода, он оставит непрочитанные символы в потоке (те, которые не могут быть преобразованы в целое число, по крайней мере, символ возврата, который вы вводите для ввода), который следующий getline
будет потреблять, думая, что он уже прочитал (пустую) строку.
#include <limits>
//...
cin >> pz->diameter;
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
cout << "Enter the company name: ";
// use getline because the company name can have spaces in it.
getline(cin, pz->szCompany);
Ваша проблема не имеет ничего общего со структурой или указателями, просто нормальное поведение входных потоков.
Возможно, вам также придется иметь дело с неправильным вводом. Например, если ввести не-число, где ожидается число, то поток будет переведен в состояние ошибки, так что все последующие попытки чтения потерпят неудачу, если вы не справитесь с этим. Лучше прислушайтесь к совету Нейла, но для получения ввода от пользователя может также иметь смысл использовать функцию для форматированного ввода, которая запрашивает у вас, пока вы не получите действительный ввод:
template <class T>
T input(const std::string& prompt, const std::string& error_prompt)
{
std::cout << prompt;
T result;
while (!(std::cin >> result)) {
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << error_prompt;
}
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
return result;
}
//...
pz->weight = input<float>("Enter the weight: ", "Please enter a numeric value: ");