【问题标题】:getch expects extra charactergetch 需要额外的字符
【发布时间】:2012-11-04 08:25:20
【问题描述】:

您好,我是编程新手,我正在用 C 编写程序。

在我的头文件中有这个宏:

#define yesno(c) (c==ENTER || c==' ' || c=='\t') ? ENTER : ESC

在我的程序中我有这个代码

char keypressed()
{ char c;
c =getch();
return yesno(getch());
 }

所以我想问的是,为什么当我要求返回yesno(c)时,我只需要按一次按钮,而当我使用返回yesno(getch())时,我必须再按一次按钮两次或三次?

从宏调用时getch() 有问题吗?

【问题讨论】:

    标签: c macros getch


    【解决方案1】:

    因为当你使用

    yesno(getch());
    

    它扩展为:

    (getch()==ENTER || getch()==' ' || getch()=='\t') ? ENTER : ESC`
    

    当宏像这样展开时,这意味着getch()实际上可以被调用1、2或3次,因为逻辑上的||意味着:

    getch() == '\n' ? if true return ENTER, false test next one
    getch() == ' '  ? if true return ENTER, false test next one
    getch() == '\t' ? if true return ENTER, false return ESC
    

    如果您使用gcc 编译器,您可以使用-E 标志找出您的宏扩展为什么:

    gcc -E myprog.c -o mprog.m
    

    【讨论】:

    • 感谢您的帮助,但请您说得更清楚好吗?正如我所说,我是编程新手,所以如果你能解释一下在这种情况下会发生什么以及在哪里使用 gcc,我将不胜感激。如果这对您来说似乎很简单或微不足道,我很抱歉,但我希望有更好的看法。
    • @user1827339 我更新了这个问题,希望这能让它更清楚:)
    【解决方案2】:

    C 使用short-circuit evaluation。您从宏中获得的表达式:

    (getch()==ENTER || getch()==' ' || getch()=='\t') ? ENTER : ESC`
    

    获取一个字符,查看它是否等于 ENTER(您可能已将其定义为 \n。如果是,则整个表达式将结束,因此该函数返回 true 而不测试其他两种情况. 但是,如果不是,该函数然后获取 another 字符,测试第二个字符是否等于 ' ',如果是则返回 true。只有在测试了不同字符的所有三种情况并得到 false 之后每次,整个表达式都被认为是错误的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-02
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多