【问题标题】:Is there keyboard input that isn't considered a char?是否存在不被视为字符的键盘输入?
【发布时间】:2016-01-22 03:52:48
【问题描述】:

首先感谢您花时间阅读本文,

我目前正在用 C++ 编写一个类的驱动程序,我需要用户的一些输入。我已经开始使用typedef 来创建验证程序,这样我就可以很容易地在不同类型之间切换。对于我正在处理的特定问题,我发现我只与char 合作,这导致了我的问题:

  1. 我的验证检查输入是否为char。如果我知道我只是在使用char,那么使用验证毫无意义吗?用户输入的所有内容似乎都是一个字符。

  2. 用户可以输入任何不会被视为char 的内容吗?

这个问题可能看起来有点微不足道,但我以前从未真正想过这个问题!仍在学习语言,所以任何指导表示赞赏。

有问题的代码(ElementType 的类型为char):

void getInput( ElementType & cho )
{
    while ( !(cin >> cho) )
    {
        cout<< "That is an invalid input..."
            << "\nTry again: ";
    }
    cout<< endl;
}

【问题讨论】:

  • 这一切都非常模糊。您的术语不够准确,无法在没有看到代码的情况下正确回答这个问题。
  • 大概你的意思是“一个逻辑字符,其内部表示由单个 8 位字节编码一个 7 位或 8 位值”,而不是 char。这不是迂腐:两者是完全不同的,当你谈论这种事情时,差异是至关重要的。
  • 你能澄清你的问题吗? cin 流被定义为输入一系列char 对象,因此根据定义,任何输入都是char

标签: c++ validation input


【解决方案1】:

有什么用户可以输入但不会被视为字符的内容?

是的:ShiftCtrlAltNum Lock 等等。

关键是键盘是它自己的野兽,每次按键,每个按键的按键释放都有潜在的输出。键盘驱动程序(软件)获取这些事件并将它们转换为一系列char 用于程序的cin/stdin。或者,程序可以访问低级事件,但可能超出标准 C++ 代码。

建议使用 cin 偶尔收到任何的模型,通常是 256 个不同的 char,包括 '\0',直到程序结束或 cinsome source 可以是键盘、重定向文件输入、管道输入或远程设备。忽略输入通常来自键盘的想法。它只是一个char 的序列。

使用验证毫无意义吗?

验证很有用。代码应根据 程序 的要求验证 char 到达 - 而不是 char 的要求。例如,代码可能无法处理空字符、负数 char、超出 ASCII 范围 0 - 127 的 char 或行尾之间的太多 char。验证输入使代码能够抵御黑客利用易受攻击的程序。

【讨论】:

    【解决方案2】:

    在 Linux 下,使用 UTF-8 输入,我当然可以输入很多不是 char 的内容。例如。键入 á 给出两个字节。还有很多其他的,可以直接键入,具体取决于适当的键盘处理方式。

    国际字符处理是复杂的。并非所有世界都使用 ASCII。

    【讨论】:

    • 正确,但 IOStreams 读取 chars。 UTF-8 字符由两个字节组成并不重要:C++ 不读取 UTF-8。它读取字节。它总是读取char。那么,你能把任何“不是char”的东西传递给C++吗?否。“验证输入是否为char”有意义吗?不;你不能“验证”类型系统。 (根据需要将上面的char 替换为wchar_t;我在这里对提取方法进行了假设,这是另一点:我们必须这样做,因为问题在当前形式下无法回答。)跨度>
    • 您能否解释一下您所指的“提取方法”,以便我更好地提出问题?
    • @LightnessRacesinOrbit,是的,C++ 读取八位字节(也称为“字节”),但那些不是字符。 C/C++ 用来存储八位字节的类型(误导性地)称为char。与Wikipedia 对比,特别是在Unicode standard 中查找术语的定义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    相关资源
    最近更新 更多