我有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语句验证字母字符是否安全?如果使用此功能,需要采取什么预防措施?
答案 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)
只是将评论中的讨论的智慧总结为一个简短的答案。
safe
你的意思并不清楚。它不太可能立即导致灾难,但UB在某些重要代码(例如控制飞机的程序)中可以做到。