【问题标题】:why std::cin doesn't give error on "char"为什么 std::cin 在“char”上没有给出错误
【发布时间】:2013-12-10 20:35:05
【问题描述】:

这是一个小代码:

char a;
while(std::cin >> a) {
    std::cout << a << " is pressed\n";
}

当我输入“w”时,我得到“w is press”。 当我输入“www”时,我连续 3 次得到“w is press”。

谁能解释一下为什么会这样?

谢谢

【问题讨论】:

  • 提示:while (std::cin &gt;&gt; a).
  • 你为什么期望它给出错误?
  • 因为它是一个字符串。但后来我明白它有点像std::cin &gt;&gt; a &gt;&gt; a &gt;&gt; a;。我该如何改变呢?
  • 什么你想达到/期望std::cin表现?这可能与现实不同(即std::istream 的实际行为方式)...

标签: c++ inputstream cin


【解决方案1】:

答案的第一部分在代码的第一行。

char a;

变量a 是单个char,通常用于存储表示显示字符的代码的8 位值。如果显示为 ASCII,则(值)0 = 无字符,(值)32 = 空格,值 48 =(字符)'0',等等。

std::cin 是类std::istream 的一个实例,它有各种成员和运算符重载来处理不同的类型。对于char,您正在调用

std::istream::operator(char)

从输入流中读取一个char,正好是一个,然后返回。

#include <iostream>
int main()
{
    char a, b, c;
    std::cin >> a >> b >> c;
    std::cout << "a = " << a << ", b = " << b << ", c = " << c << '\n';
    return 0;
}

【讨论】:

    【解决方案2】:

    有一个queue 的输入。如果你输入太多,你的输入会耐心等待......

    【讨论】:

    • 我怎样才能清除队列呢?在第一个字符之后
    • 不走运;我刚刚将 std::string 输入到 cin 并通过 string.at(0) 获取字符
    【解决方案3】:

    当您使用 std::cin 读取 char 变量时,它一次读取一个字符。这就是为什么您在输入 www 的 while 循环中获得 3 次迭代。

    【讨论】:

    • @Gasim 如果您只需要一个输入,请不要使用一段时间
    • 好吧,那么我应该使用字符串,知道它会起作用,对吧?
    • @Gasim '好吧,那我应该使用字符串...' 不!看起来,你会想要处理按键事件,而不是处理流式输入(来自键盘、文件、套接字连接等)。
    猜你喜欢
    • 2018-03-05
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2015-06-14
    • 2018-12-02
    • 2013-04-03
    相关资源
    最近更新 更多