getchar()工作异常

时间:2013-10-11 11:34:56

标签: c stdin getchar

我试图一次读取一个字符并以累积方式将它们转换为int。如果用户输入的数字不是数字,我将重新开始整个过程​​。 当我运行此代码时,{i}下面的代码只有在按下回车键后才会执行,而不是按每次按键执行。简而言之,它不是一次取一个字符,而是使用enter作为输入终止的字符串,然后从输入字符串一次读取一个字符并执行while循环。 我很确定它与printf语句中的getchar()有关。 我的代码:

\n

2 个答案:

答案 0 :(得分:1)

这是因为getchar()依赖于终端设置。由于大多数终端都启用了行缓冲,因此只有按Enter键才会等待。使用termios.h,您可以禁用它。 getch()仅限Windows。

以下是一些代码来执行getch()在Linux中所做的事情。

#include <termios.h>

char getch(void) {
    /* get original settings */
    struct termios new, old;
    tcgetattr(0, &old);
    new = old;

    /* set new settings and flush out terminal */
    new.c_lflag &= ~ICANON;
    tcsetattr(0, TCSAFLUSH, &new);

    /* get char and reset terminal */
    char ch = getchar();
    tcsetattr(0, TCSAFLUSH, &old);

    return ch;
}

另外,为什么realloc(blah, 0)?为什么不只是free(blah)? 此外,malloc(0)是未定义的行为。它可以返回NULL或给出唯一的指针。与realloc(blah, 0)相同。

答案 1 :(得分:0)

只需使用:

#include <stdlib.h>

char getch()
{
char c; // This function should return the keystroke

system("stty raw");    // Raw input - wait for only a single keystroke
system("stty -echo");  // Echo off

c = getchar();

system("stty cooked"); // Cooked input - reset
system("stty echo");   // Echo on - Reset

return c;
}