簡體   English   中英

C ++-帶有結構指針的字符串輸入?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM