我想在C++中读取一些多个字符,但它永远不会读取第二个字符

I want to read some multiple chars in C++ but it never reads the second char

本文关键字:读取 字符 永远 第二个 C++      更新时间:2023-10-16

我想简单地读取两个字符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.
*************************

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

这里的问题是标准输入(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>>将忽略前导空格,然后读取下一个值。所以它将忽略新行(它们是空格(。

您在这里的问题是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;
}

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

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

与其使用cin.get()不如使用cin >> ch1cin >> ch2