【问题标题】:C++ cin weird behaviour [duplicate]C ++ cin奇怪的行为[重复]
【发布时间】:2013-06-09 02:07:23
【问题描述】:

我有以下代码:

    int data = 0;
    cout << "Enter a number: ";
    cin >> data;
    cout << "You entered " << data << endl;

    string str;
    cout << "Enter a string: ";
    getline(cin,str);
    cout << "Your entered " << str << endl;

在得到第一个提示后,我输入了一个有效的数字 10。但是当我点击返回时,程序输出:

您输入了 10 输入一个字符串:你输入的

换句话说,它没有要求输入第二个字符串。发生了什么?

谢谢

【问题讨论】:

标签: c++ iostream cout cin


【解决方案1】:
std::cin >> data;

当您输入data 的数字并按Return 键提交您的输入时,将在流中插入一个新行。新行是输入流的默认分隔符,当使用std::getline(std::cin, str) 时,编译器会看到流中已经有新行,它将停止运行。要解决这个问题,您需要忽略带有std::cin.ignore 的违规字符:

std::cin.ignore();
std::getline(std::cin, str);

【讨论】:

  • 有什么理由不使用std::cin &gt;&gt; std::ws;
【解决方案2】:

在输入流上混合数字和字符串的经典问题。两者都使用 getline 并使用 stringstream 解析。

【讨论】:

  • 感谢指正。修好了。
【解决方案3】:

查看以下内容。问题是读取整数不会在终止换行符中读取。当您使用 getline(...) 时会使用该换行符,因此您的程序会退出。您需要先使用该换行符。

int data = 0;
cout << "Enter a number: ";
cin >> data;
cout << "You entered " << data << endl;

string str;
cout << "Enter a string: ";
getline(cin,str); // consume endline <------------------
getline(cin,str);
cout << "Your entered " << str << endl;

【讨论】:

    【解决方案4】:

    当您输入 10 时,您实际上是在输入“10\n”,即 10 加上新行。它可能取决于操作系统,但发生的基本想法是 cin 只是从输入缓冲区中读取 10,然后留下换行符。然后,当您的程序到达 getline 部分时,getline 从输入缓冲区中读取“\n”。由于 "\n" 是 getline 的默认终止字符,因此 getline 完成并且您的程序继续运行。

    因此,在您的程序结束时,str 仅包含“\n”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-11
      • 2022-01-13
      • 1970-01-01
      • 2021-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多