【问题标题】:C++ - String input with a pointer-to-structure?C++ - 带有结构指针的字符串输入?
【发布时间】:2010-02-08 13:28:23
【问题描述】:

如何使用指向结构的指针来获取将存储在字符串变量中的输入?我认为简单地将 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;

【问题讨论】:

    标签: c++ pointers struct


    【解决方案1】:

    当您使用&gt;&gt; 读取输入时,它会在流中留下未读字符(那些无法转换为整数,至少是您输入输入的返回字符),以下@987654323 @ 会认为它已经读取了一个(空)行。

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

    【讨论】:

    • 感谢您的回答。我设法通过执行“char dummy; ... cin >> pz->diameter; cin.get(dummy);”来解决这个问题清除换行符,而不是使用 .
    • 这样做的问题是用户可能输入的不仅仅是换行符,例如空格或其他不可转换的字符。
    • @cornjuliox - 您可以考虑阅读以下内容:daniweb.com/forums/thread90228.html#
    【解决方案2】:

    这与指向结构实例的指针无关。将行输入与格式化输入混合并不是一个好主意。事实上,使用来自交互式输入流的格式化输入根本不是一个好主意。您应该改为使用 getline() 读取每个输入,然后转换为所需的类型。

    【讨论】:

      【解决方案3】:

      添加任一:

      cout << "Enter the company name: " << std::endl;
      

      cout << "Enter the company name: ";
      cout.flush();
      

      关于流缓冲的问题

      【讨论】:

      • 我的印象是 cout 和 cin 无论如何都会自动同步。
      猜你喜欢
      • 2015-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-14
      • 2021-04-02
      • 2018-05-01
      • 2020-03-23
      • 2021-04-29
      相关资源
      最近更新 更多