std :: cin进入char数组跳过空格?

时间:2011-08-30 08:59:23

标签: c++ stdin

CODE:

#include <iostream>

#define BUFF 100

using namespace std;

int main(int argc, char* argv[])
{
    char input[BUFF];

    cout << "Input:\n>";

    cin >> input;

    cout << "\n\nOutput:" << input;

    cin >> input;
    cin >> input;
}

为什么读取char数组中的输入会跳过空格?哦,有2个cin(最后),因为它有点奇怪,如果有一个空格,当有1个cin时退出...不知道为什么。

EG

我输入cup cake,然后输出cup

2 个答案:

答案 0 :(得分:2)

问题是你想读什么?如果你想阅读一行,你应该使用getline,如果可能的话,使用std::string,因为它会根据需要增长字符串:

#include <iostream>
#include <string>
int main() {
   std::string line;
   std::getline( std::cin, line );
}

答案 1 :(得分:1)

这基本上是因为operator>> std::cin在空格(即\t\n)之间占用一个“输入对象”并将其读入给定变量/对象。尝试:

std::string input[2];
std::cout << "Input:\n>";
std::cin >> input[0] >> input[1];

对于输入cup cake,您将获得input[0] == "cup"input[1] == "cake"

如果你没有读取整个输入,它会保留在输入缓冲区中;这就是为什么你在cin >> input结束时需要两个main(),这让你感到困惑。解释是您将"cup"读入input,但"cake"保留在缓冲区中以备下次阅读。

当读入几个变量时,这种行为非常方便,例如:

int a, b, c;
std::cin >> a >> b >> c;

这允许你编写由空格分隔的三个整数,它们将被读入适当的变量。如果您需要整行输入,请按照DavidRodríguez的建议尝试并使用std::getline

编辑实际上,在读取std::cin >> input[0] >> input[1]之后,输入缓冲区仍然不会为空,因为它包含\n字符(按ENTER后)。要清空输入缓冲区,请尝试:

std::cin.clear(); // optional, use when input has gone bad; clears error flags
std::cin.sync(); // empty buffer