Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用getchar读取多字符键符号?_C_Unix_Terminal_Io - Fatal编程技术网

如何使用getchar读取多字符键符号?

如何使用getchar读取多字符键符号?,c,unix,terminal,io,C,Unix,Terminal,Io,我在原始模式下使用终端,问题是一些按键返回一个int,而另一些按键返回两个int。例如,“A”的getchar()是65,但如果用户按Alt-D,则getchar()返回27和100。功能键甚至可以返回三个代码。例如,“F4”在我的终端上生成27 79 83。因此,多字节序列总是以27开头,但之后可能是一个或两个字符 这是一个问题,因为如果我在一个字符后停止读取,那么一个杂项代码会留在缓冲区中,因此下次我的输入循环再次启动时,它会读取它并获得一个错误的值。因此,例如,在上述情况下,如果用户按F4

我在原始模式下使用终端,问题是一些按键返回一个int,而另一些按键返回两个int。例如,“A”的getchar()是65,但如果用户按Alt-D,则getchar()返回27和100。功能键甚至可以返回三个代码。例如,“F4”在我的终端上生成27 79 83。因此,多字节序列总是以27开头,但之后可能是一个或两个字符

这是一个问题,因为如果我在一个字符后停止读取,那么一个杂项代码会留在缓冲区中,因此下次我的输入循环再次启动时,它会读取它并获得一个错误的值。因此,例如,在上述情况下,如果用户按F4,则83将留在缓冲区中,稍后将被读取为字符“S”

另一方面,如果我尝试读取三个字符,那么如果转义序列只有两个字符,那么输入循环将挂起,因为getchar()是一个阻塞调用


我需要的是调用getchar(),如果我得到一个转义符(27),那么我需要某种方法来读取缓冲区中剩余的所有字符,而不是在执行此操作时阻塞。

您只需检查
getchar
返回的内容。如果是
27
,则至少需要再读取一个字符。使用
getchar
也可以阅读它,然后再次检查它返回的内容,以确定是否需要再阅读一次


差不多

int ch;  // The getchar function returns an int (important for EOF check)

if ((ch = getchar()) == 27)
{
    // Escape read, there's more characters to read
    if ((ch = getchar()) == 79)
    {
        // It's a function key, there's one more characters to read
        ch = getchar();

        // Check which function key was input
        switch (ch)
       {
       case 83:
           // F4...
           break;

        //...

        default:
            // Unknown key...
        }
    }
    else
    {
        // Not a function key, perhaps Alt-D?
        if (ch == 100)
        {
            // ...
        }
    }
}
else
{
    // Not escape, a normal key...
}

您只需检查
getchar
返回的内容。如果是
27
,则至少需要再读取一个字符。使用
getchar
也可以阅读它,然后再次检查它返回的内容,以确定是否需要再阅读一次


差不多

int ch;  // The getchar function returns an int (important for EOF check)

if ((ch = getchar()) == 27)
{
    // Escape read, there's more characters to read
    if ((ch = getchar()) == 79)
    {
        // It's a function key, there's one more characters to read
        ch = getchar();

        // Check which function key was input
        switch (ch)
       {
       case 83:
           // F4...
           break;

        //...

        default:
            // Unknown key...
        }
    }
    else
    {
        // Not a function key, perhaps Alt-D?
        if (ch == 100)
        {
            // ...
        }
    }
}
else
{
    // Not escape, a normal key...
}

getchar块,因此如果执行此操作,我的程序将挂起this@TylerDurden再次调用
getchar
之前,请记住检查上一次调用
getchar
的结果。这是一组嵌套的
if
语句。我无法知道特定的转义序列是2个字符还是3个字符。@TylerDuden每个键应该为代码生成的内容应该有很好的文档记录,并且可以在Internet上找到。getchar blocks,因此,如果我这样做,我的程序将挂起this@TylerDurden再次调用
getchar
之前,请记住检查上一次调用
getchar
的结果。这是一组嵌套的
if
语句。我无法知道特定的转义序列是2个字符还是3个字符。@Tylerduden每个键应该为代码生成什么应该有很好的文档记录,并且可以从互联网上找到。