什么时候使用`isalpha()`是安全的

时间:2017-05-27 12:45:54

标签: c++ ascii glfw

我有PRNG key_callback(),我正在尝试检测是否按下了字母字符。我使用这个函数GLFW。我注意到,如果执行以下代码,某些键(如Shift和Alt)将被视为字母字符:

#include <iostream>                                                                                                                                                                                         

int main()
{
    // 340: printed int if the Shift key is pressed.
    if( isalpha(340) )
        std::cout << "alpha"     << std::endl;
    else
        std::cout << "not alpha" << std::endl;

    return 0;
}

前面的代码产生alpha。我可以验证传递给函数的整数范围,但这没有任何意义,因为我没有利用该函数。 我的问题是将任何整数传递给该函数并使用简单的if语句验证字母字符是否安全?如果使用此功能,需要采取什么预防措施?

2 个答案:

答案 0 :(得分:2)

key_callback不是C ++的标准部分,因此我搜索并假设您正在谈论的那个是GLFW库的一部分。在该库中,key_callback提供键盘扫描码。

扫描码不是字符。在典型的输入模型中,有一个状态机将扫描码(以及扫描码的序列和组合)映射到字符。这个层允许您将QWERTY键盘更改为像Dvorak键盘一样工作,或者像设计用于键入其他语言的键盘。这个key_callback是较低级别,并将映射留给您。

C ++ std::isalpha函数将char强制转换为int或特殊的标记值EOF,通常为-1。 (在某些系统上,您会发现在将char转换为unsigned char之前,需要先将int转换为std::isalpha。)扫描码不是字符,所以通过扫描码到unsigned char毫无意义。

特别是,值340超出EOF的范围,而不是isalpha,因此我们无法做出任何合理的事情。< / p>

如果您需要字符,则必须构建自己的扫描码(以及扫描码组合)到字符的映射。看起来该库具有为扫描码定义的常量。例如,GLFW_KEY_LEFT_SHIFT是340.这应该会有所帮助。如果您只需要知道是否按下或释放了特定键,您可以将扫描码与适当的常量进行比较。

注意:您标记了问题C ++,但是您链接到C版np.log(array) 的文档。

答案 1 :(得分:1)

只是将评论中的讨论的智慧总结为一个简短的答案。

  1. 您的代码有undefined behaviour(UB),原因是评论中讨论的原因。
  2. 因此,结果是不可预测的,很可能是不正确的。
  3. 应尽可能避免使用带UB的代码。
  4. safe你的意思并不清楚。它不太可能立即导致灾难,但UB在某些重要代码(例如控制飞机的程序)中可以做到。