【问题标题】:when i call my function the while loop skips a step当我调用我的函数时,while循环会跳过一个步骤
【发布时间】:2013-11-12 09:58:51
【问题描述】:

这是我的代码:

string getFileContents(istream& file_contents){
    string line;
    getline(file_contents, line);

return line;
}

project read_project(istream& in){
    project newproject;
    while(cin){
        cout << "Enter your project name: ";
        newproject.proname = getFileContents(cin);

        cout << "Enter a description: ";
        newproject.prodesc = getFileContents(cin);

        cout << "How long until deadline: ";
        newproject.protime = getFileContents(cin);

    promap.insert(pair<string, project> ( newproject.proname , newproject));
    cout << endl << "You created a new project: " << newproject.proname
    << endl << "Project description: " << newproject.prodesc ;
}
}



int main(){

string inputcmd;

while (cin){
cout << "TYPE A COMMAND" << endl;   
cin >> inputcmd;

if (inputcmd == "makenew")
    cout << "MAKING NEW PROJECT";
    read_project(cin);
}
return 0;

我的目标是成功地将项目类型存储在地图中。用户首先输入一个“命令”“makefile”,这会调用一个 read_project 函数,这两个函数都以 cin 作为参数进行操作。问题是当我运行代码时它会给出奇怪的结果,就像我第一次输入 makefile 时它会跳过“输入您的项目名称:”并且对于“输入您的项目描述”是正确的。为什么这样做?在所有后续循环中它都能正常工作,首先询问项目名称并等待输入。

【问题讨论】:

    标签: c++ function loops while-loop cin


    【解决方案1】:

    当您在main 函数中进行初始输入时,它会读取一个字符串,但会在缓冲区中租用换行符。因此,当您稍后调用 std::getline 时,它会将换行符读取为空行。

    你可以通过这样做来克服它,例如

    cout << "TYPE A COMMAND" << endl;   
    cin >> inputcmd;
    
    // Skip to the end of the line, and remove the newline from the input buffer
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    
    // The rest of the code...
    

    另外,你不应该这样做while (cin) ...,因为直到输入操作失败后才会设置 eof 和错误标志。这意味着如果您在第一个输入提示符处按下 EOF 键(CTRL-ZCTRL-D(取决于系统)),直到之后您才会注意到它您尝试读取所有输入,这将失败但您不检查它。

    相反,例如

    cout << "TYPE A COMMAND" << endl;
    while (cin >> inputcmd)
    {
        ...
    
        cout << "TYPE A COMMAND" << endl;
    }
    

    一个简单而完整的例子,展示了我上面描述的技术:

    #include <iostream>
    #include <string>
    
    void read_project()
    {
        std::string name, descr, deadline;
    
        std::cout << "Project name: ";
        std::getline(std::cin, name);
    
        std::cout << "Project description: ";
        std::getline(std::cin, descr);
    
        std::cout << "Project deadline: ";
        std::getline(std::cin, deadline);
    
        std::cout << "Project entered:\n"
                  << "    Name       : " << name << '\n'
                  << "    Description: " << descr << '\n'
                  << "    Deadline   : " << deadline << '\n';
    }
    
    int main()
    {
        std::string cmd;
    
        std::cout << "Enter command: ";
        while (std::cin >> cmd)
        {
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    
            if (cmd == "makenew")
                read_project();
    
            std::cout << "Enter command: ";
        }
    }
    

    注意:您可能还想为std::getline 调用添加额外的错误检查。

    【讨论】:

    • 当我这样做时(cin >> inputcmd)它由于某种原因卡在这个while循环中
    • 当我调用 cin.ignore(...) 时,它会给出很多乱码错误输出
    • @notamathwiz 在我的回答中添加了一个完整的、有效的示例,以说明我的意思。
    • 更简单的方法是使用getline 来读取命令。
    猜你喜欢
    • 2020-03-11
    • 1970-01-01
    • 2014-07-08
    • 2012-05-23
    • 2023-02-06
    • 2019-08-04
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    相关资源
    最近更新 更多