C++ - 带有结构指针的字符串输入?

标签 c++ pointers struct

如何使用指向结构的指针来获取将存储在字符串变量中的输入?我认为简单地将 pz->szCompany 传递给 getline() 的行为与我使用 . Pizza 的普通实例上的运算符(而不是指针),但是当我运行这个程序时,它完全跳过了公司名称提示。

// 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: ");

关于C++ - 带有结构指针的字符串输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2221842/

相关文章:

C++ 等效于 Java static final String

c++ - 如何在编译时使用 std::make_tuple ?

c - 输出是如何变成 '10' 的?

c++ - 在 C++ 中引用 const 对象/指针

c - 如何将单指针赋值为双指针

matlab - 加密 matlab 结构体的部分

c - 对于结构变量s1,s2,为什么我可以初始化 "s1={25,3.5}",将s2赋值为 "s1=s2",然后就不能使用“s1={59,3.14}?

c++ - 如何执行和写入标准输入并将标准输出通过管道传输到套接字?

c++ - 使用 `emplace_back`而不是 `push_back`时没有缩小警告

c++ - 错误 : could not convert '<brace-enclosed initializer list>()' from '<brace-enclosed initializer list>' to 'struct'