我正在阅读一些同事编写的一些代码,他编写了以下代码:
int keych = 0;
keych = _getch();
if (keych == 104 || keych == 104 - 32) //Help
{
printf(cHelp);
}
我不明白为什么他不使用简单的char数据类型,这有助于编写更少的代码。使用该方法而不是char数据类型来获取用户输入有什么好处?
答案 0 :(得分:7)
使用
if (keych == 104 || keych == 104 - 32) //Help
确定输入字符'h'
或'H'
是否错误。
h
和H
的系统(例如ASCII)。最好使用:
if (keych == 'h' || keych == 'H')
或
if ( tolower(keych) == 'h' )
答案 1 :(得分:2)
Oups,unicode和ascii不完全相同,或者更确切地说ascii是unicode的子集(127个第一个代码点)。 104或(0x98为hexa)是' h'的ASCII码,因此这里不涉及unicode。使用ascii代码的唯一优势是它将在非ASCII系统上中断,并且可能仍然存在EDCDIC系统...而且正如你在评论中所说的那样,104比以前更加神秘。 #39; H'
TL / DR:除非您有充分的理由,否则永远不要用ascii代码点替换字符。
答案 2 :(得分:1)
如果不是非常直观的新手存储字符变量并将它们作为int传递,这是一个很好的做法。标准库可以做到这一点,fputc()接受而int不是char。在C中,sizeof('a')产生2或4,具体取决于int的大小,而不是1(sizeof(char))。
原因是int可以保存EOF,它不是char,意味着输入或错误条件的结束。还有一个效果是代码可以很好地扩展到unicode。
答案 3 :(得分:0)
在编码中通过代码点引用(可打印)字符是合理的唯一一次是当您知道您正在处理的数据不是您的程序的本机形式时 - 这只有在您实施时才有可能代码转换,可以是iconv
之类的程序,也可以是程序的i / o类中的转换层。通常你不需要自己写这些东西;这就是图书馆的用途。
即使您正在编写转换,也可以为您正在使用的值指定名称,例如。
static const int UNICODE_LATIN_SMALL_LETTER_H = 0x68;
在问题的特定情况下,假设_getch()
类似于Curses getch()
,那么您应该期望它与程序源字符集中的字符常量一致。< / p>