[英]C++ - String input with a pointer-to-structure?
如何使用結構指針獲取輸入,該輸入將存儲在字符串變量中? 我認為簡單地將pz-> szCompany傳遞給getline()的行為就如同我使用過一樣。 比薩的正常實例(而不是指向指針)上的運算符,但是當我運行此程序時,它將完全跳過公司名稱提示。
// Parts of the program omitted.
struct Pizza {
string szCompany;
float diameter;
float weight;
};
Pizza* pz = new Pizza;
cout << "Enter the weight: ";
cin >> pz->weight;
cout << "Enter the company name: ";
// use getline because the company name can have spaces in it.
getline(cin, pz->szCompany);
cout << "Enter the diameter: ";
cin >> pz->diameter;
cout << "\nCompany name: " << pz->szCompany;
cout << "\nWeight: " << pz->weight;
cout << "\nDiameter: " << pz->diameter;
// cannot forget this step.
delete pz;
return 0;
當您使用>>
讀取輸入時,它將在流中留下未讀的字符(那些不能轉換為整數的字符,至少是您鍵入要輸入的返回字符),下面的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);
您的問題與結構或指針無關,而與輸入流的正常行為無關。
您可能還必須處理不正確的輸入。 例如,在期望數字的地方輸入非數字將使流處於錯誤狀態,因此除非您處理它,否則所有隨后的讀取嘗試都將失敗。 最好采用Neil的建議,但是對於從用戶那里獲取輸入,使用格式化輸入功能提示您直到獲得有效輸入也可能有意義:
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: ");
這與指向結構實例的指針無關。 將行輸入與格式化輸入混合在一起根本不是一個好主意。 實際上,根本不使用交互式輸入流中的格式化輸入。 您應該改用getline()讀取每個輸入,然后轉換為所需的類型。
添加:
cout << "Enter the company name: " << std::endl;
要么
cout << "Enter the company name: ";
cout.flush();
您擔心與流緩沖有關
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.