std::cin到char数组中跳过空格
std::cin into char array skips spaces?
代码:
#include <iostream>
#define BUFF 100
using namespace std;
int main(int argc, char* argv[])
{
char input[BUFF];
cout << "Input:n>";
cin >> input;
cout << "nnOutput:" << input;
cin >> input;
cin >> input;
}
为什么当您将输入读取到char数组中时,它会跳过空格?哦,还有2个cin(在结尾(,因为它的行为有点奇怪,当有1个cin时,如果进入一个空间,它就会退出。。。也不知道为什么。
例如
我输入cup cake
,它输出cup
问题是你想读什么?如果你想读取一行,你应该使用getline
,如果可能的话,使用std::string
的那个会根据需要增长字符串:
#include <iostream>
#include <string>
int main() {
std::string line;
std::getline( std::cin, line );
}
这基本上是因为std::cin
的operator>>
在空白(即、
n
、cup cake
(之间获取一个"输入对象",并将其读取到给定的变量/对象中。尝试:
std::string input[2];
std::cout << "Input:n>";
std::cin >> input[0] >> input[1];
对于输入input[0] == "cup"
,您将得到input[1] == "cake"
和cin >> input
。
如果您不读取整个输入,它将保留在输入缓冲区中;这就是为什么在"cup"
的末尾需要两个main()
,这让您感到困惑。解释是将input
读取到"cake"
中,但std::getline
保留在缓冲区中,为下一次读取做好准备。
当读取几个变量时,这种行为非常方便,例如:
int a, b, c;
std::cin >> a >> b >> c;
这允许您编写三个由空格分隔的整数,它们将被读取到适当的变量中。如果您需要整行输入,请按照David Rodríguez的建议尝试并使用std::cin >> input[0] >> input[1]
。
EDIT实际上,读取n
后,输入缓冲区仍不会为空,因为它包含一个CCD_20字符(按ENTER键后(。清空输入缓冲区尝试:
std::cin.clear(); // optional, use when input has gone bad; clears error flags
std::cin.sync(); // empty buffer