Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.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
在使用fgetc(stdin)之后,如何在PHP中刷新stdin?_Php - Fatal编程技术网

在使用fgetc(stdin)之后,如何在PHP中刷新stdin?

在使用fgetc(stdin)之后,如何在PHP中刷新stdin?,php,Php,如果用户在调用fgetc(STDIN)时键入多个字符,则对fgetc(STDIN)的另一次调用将永远不会要求新字符,并将使用缓冲区中的下一个字符。我解决这个问题的一个方法是创建以下函数: <?php function get_char_from_stdin() { if (($char = fgetc(STDIN)) != "\n") fgets(STDIN); return $char; } ?> 有没有

如果用户在调用
fgetc(STDIN)
时键入多个字符,则对
fgetc(STDIN)
的另一次调用将永远不会要求新字符,并将使用缓冲区中的下一个字符。我解决这个问题的一个方法是创建以下函数:

<?php
    function get_char_from_stdin() {
        if (($char = fgetc(STDIN)) != "\n")
            fgets(STDIN);
        return $char;
    }
?>

有没有比上述更优雅的解决方案

另外,如果我的术语不通,请原谅。请更正任何误用的术语。谢谢


编辑:这在Windows上有效吗?我现在正在使用Mac。

STDIN是缓冲的,因此为了获得调用函数后输入的第一个字符,您必须打开一个带有空缓冲区的新流

function get_char_from_stdin() {
    $stdin = fopen('php://stdin', 'r');
    return fgetc($stdin);
}

STDIN是缓冲的,因此为了获得调用函数后输入的第一个字符,必须打开一个带有空缓冲区的新流

function get_char_from_stdin() {
    $stdin = fopen('php://stdin', 'r');
    return fgetc($stdin);
}

似乎是在windows上工作。我尝试了
php-r“而($char!='.){$char=fgetc(STDIN);echo$char;}”
它工作了,我可以键入chars!顺便说一句,
$char
在脚本的开头没有定义,但是除非你告诉PHP这样做,否则它会很高兴地继续运行(我个人认为这会产生反作用)。好吧,我的脚本是一个糟糕的脚本,这是一个糟糕的答案,我也不喜欢它!如果你愿意的话,我可以删除我的帖子。这似乎是在windows上工作。我尝试了
php-r“而($char!='.){$char=fgetc(STDIN);echo$char;}”
它工作了,我可以键入chars!顺便说一句,
$char
在脚本的开头没有定义,但是除非你告诉PHP这样做,否则它会很高兴地继续运行(我个人认为这会产生反作用)。好吧,我的脚本是一个糟糕的脚本,这是一个糟糕的答案,我也不喜欢它!如果你愿意,我可以删除我的帖子。好吧,事实证明,这只适用于一个换行符,但它仍然会将下一行作为输入。你说的“它仍然会将下一行作为输入”是什么意思?它不会跳过在调用函数之前输入的行,也不会跳过空行。它所做的只是读取第一行的一个字符,然后跳过这一行的其余部分,下一个调用将读取第二行,即使您在调用之间输入了5行。我想你真正想要的是,它跳过了函数调用之间输入的所有内容,当你调用它时,它会等待下一个输入。最后有机会尝试一下。它比我的功能更好,我认为这是可以接受的。谢谢。好的,这只适用于一个换行符,但它仍然将下一行作为输入。你说的“它仍然将下一行作为输入”是什么意思?它不会跳过在调用函数之前输入的行,也不会跳过空行。它所做的只是读取第一行的一个字符,然后跳过这一行的其余部分,下一个调用将读取第二行,即使您在调用之间输入了5行。我想你真正想要的是,它跳过了函数调用之间输入的所有内容,当你调用它时,它会等待下一个输入。最后有机会尝试一下。它比我的功能更好,我认为这是可以接受的。谢谢