我想在C ++中读取多个字符,但是它从不读取第二个字符

时间:2018-10-22 18:42:06

标签: c++ cin

我只想用C ++读取两个字符,但是不能占用第二个字符!

#include <iostream>
#include <sstream>

using namespace std;

int main()
{

    cout << "reading char: ";
    char ch1;
    cin.get(ch1);
    cout << ch1 << endl;

    char ch2;
    cout << "reading char: ";
    cin.get(ch2);
    cout << ch2 << endl;


    return 0;
}

有人可以帮助我解决这个问题吗?

这是输出:

reading char: a

a

reading char:


Process returned 0 (0x0)   execution time : 2.158 s
Press any key to continue.

*************************

程序到此结束,并且不读取第二个字符

4 个答案:

答案 0 :(得分:3)

这里的问题是标准输入(std::cin)被缓冲。因此,在按下<return>键之前(或您填满缓冲区之前),程序将无法输入。这给您的印象是代码将始终等待用户输入。

这不是事实。如果当前缓冲区为空,它将仅等待用户输入。如果缓冲区中有数据,它将读取该数据,而不是等待用户输入。

一读:

cin.get(ch1);

程序启动,因此缓冲区为空。因此,当您从std::cin进行读取时,程序将暂停等待刷新缓冲区,然后将读取字符。如果您按下A<return>,则缓冲区中的缓冲区将刷新为两个字符。

Buffer: 'A' '\n'

您的读取内容现在将从输入'A'中检索第一个字符,而将'\n'留在输入流中:

Buffer: '\n'

现在第二次读取看到缓冲区不为空。

cin.get(ch2);

无需等待,它将从流中读取下一个字符。因此它从流中读取'\n'字符。并继续。

解决方案:

这取决于您想要什么。您只需要该行的第一个字符吗?

std::cin.ignore(); // drops the rest of the line.
                   // The next character that will be available will
                   // be the first character of the next line.

您只想忽略空格? (这是空格/制表符/换行符等)。

std::cin >> v1 >> v2;

使用operator>>会忽略前导空格,然后读取下一个值。因此它将忽略换行符(它们是空白)。

答案 1 :(得分:2)

您的问题是get仅从流中获取单个字符。当您通过键入字符并按Enter键为首次输入输入字符时,实际上会将两个字符放入流中。您输入的一个,然后输入密钥(换行符)。这意味着您对get的第二次调用将获取仍在缓冲区中的换行符,而不必等待您输入任何内容。要解决此问题,您应该使用流提取运算符(operator >>)读取单个字符,它将跳过缓冲区中剩余的空白。这会将您的代码变成

int main()
{

    cout << "reading char: ";
    char ch1;
    cin >> ch1;
    cout << ch1 << endl;

    char ch2;
    cout << "reading char: ";
    cin >> ch2;
    cout << ch2 << endl;


    return 0;
}

答案 2 :(得分:1)

如果输入第一个字符并按Enter,则第二个get()调用将读取换行符(ASCII 10)。

答案 3 :(得分:1)

问题是当您输入一个字符然后按回车键时,您正在控制台中输入换行符。因此,对cin.get()的调用将换行符返回到ch2,然后您的程序将打印出ch1ch2中的空白换行符并退出。

您应该使用cin.get()cin >> ch1来代替cin >> ch2