我只想用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.
*************************
程序到此结束,并且不读取第二个字符
答案 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
,然后您的程序将打印出ch1
和ch2
中的空白换行符并退出。
您应该使用cin.get()
和cin >> ch1
来代替cin >> ch2