【问题标题】:cin.getline is skipping one line of input and taking the nextcin.getline 正在跳过一行输入并接受下一行
【发布时间】:2011-04-23 08:08:45
【问题描述】:

为什么 cin.getline 在正文输入的第二行开始工作,但在第一行中断?

示例程序运行:

Enter name: Will
Enter body: hello world
hello again <= It accepts this one



 char* name = new char[100];
 char* body = new char[500];

 std::cout << "Enter name: ";
 std::cin.clear();
 std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
 std::cin.getline(name, 100);

 std::cout << "Enter body: ";
 std::cin.clear();
 std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
 std::cin.getline(body, 500');
 std::cin >> body;

【问题讨论】:

  • 你的意思是它不起作用?

标签: c++ cin getline


【解决方案1】:

正如 JoshD 所说,但此外,使用 &lt;string&gt; 标头中的 std::stringstd::getline 可以节省大量工作和痛苦。

喜欢...

#include <string>
#include <iostream>
int main()
{
    using namespace std;
    std::string name;
    cout << "Enter name: ";  getline( cin, name );
}

干杯,

--阿尔夫

【讨论】:

    【解决方案2】:

    因为您忽略了 cin.ignore 语句的第一行。

    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    

    这将忽略整行。

    删除它,你会得到你想要的。

    您可能还想刷新 cout 流以确保您的输出立即打印到屏幕上。在您的 getline 之前添加 cout.flush();

    【讨论】:

    • 我删除了他们两个,除了跳过了名称输入之外,它是一样的
    • @Will03uk:我在回答中添加了一些内容。您可能需要添加冲洗。
    • 几周前我对 flush aq 做了同样的断言,但@anon 指出 std::cin 与 std::cout 相关联,在 std::cin 执行之前强制自动刷新阅读:cplusplus.com/reference/iostream/ios/tie
    猜你喜欢
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    相关资源
    最近更新 更多