当我调用我的函数时,while循环跳过一步

时间:2013-11-01 07:47:55

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

这是我的代码:

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并跳过“输入你的项目名称:”并且正确地执行“输入你的项目描述”。为什么这样做?在所有后续循环中它正常工作,首先询问项目名称并等待输入。

1 个答案:

答案 0 :(得分:2)

当您在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-Z CTRL-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电话添加额外的错误检查。