繁体   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