【问题标题】:std::cin into char array skips spaces?std::cin 进入 char 数组会跳过空格吗?
【发布时间】:2011-11-06 15:18:27
【问题描述】:

代码:

#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

【问题讨论】:

  • 跳过空格是什么意思?请举个例子。
  • @George 我输入杯子蛋糕,它输出杯子
  • 代码错误。如果我提供的输入大于 BUFFER 大小,它将继续存储它,最终破坏内存。检查读取字符串(类)的getline
  • @George Kastrinis 那不是我的问题
  • @Flyphe:这并不意味着您不应该修复它。这就是为什么他在评论而不是回答中说的。

标签: c++ stdin


【解决方案1】:

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

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

【讨论】:

  • 我正在制作一个加密程序,只是为了好玩。
  • 它将字符转换为数字,以及将这个数字添加到每个数字的长度。
  • 因为输入单词或句子的速度更快。加上这让事情变得更难不是吗?
  • @Flyphe:问题是您在处理未格式化数据时尝试使用格式化输入。
  • @Let_Me_Be 我的猜测是,他认为如果您当时读取一个字符,那么您还必须一次将其作为输入一个字符(这是不正确的)。跨度>
【解决方案2】:

这基本上是因为 std::cinoperator&gt;&gt; 在空格之间采用一个“输入对象”(即\t\n)并将其读入给定的变量/对象。试试:

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

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

如果您不读取整个输入,则它会保留在输入缓冲区中;这就是为什么您需要在main() 末尾添加两个cin &gt;&gt; input,这让您感到困惑。解释是您将"cup" 读入input,但"cake" 留在缓冲区中,为下一次读取做好准备。

这种行为在读取多个变量时非常方便,例如:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2015-01-28
    • 2021-02-26
    相关资源
    最近更新 更多