微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我可以用PHP挑战在线编程题了!

PHP挑战在线编程题

今天想在Sphere Online Judge中用PHP来在线挑战一些题目,要用到标准输入输出,但最近在写php又不想用c来写,平时写项目都是表单提交,还真没有考虑过这个,于是看了下文档。

文档在此:http://php.net/manual/zh/wrappers.php.php

一、PHP STDIN、STDOUT、STDERR简介: 

STDINSTDOUTSTDERR命令输入输出流,用于向控制台(linux shell终端、windows cmd终端)输入、输出内容,它们默认是已经打开的,可以直接对他们进行读写操作,它们只能在CLI(command-line interface,命令行界面)模式中使用,在Http模式时,它们是未定义的。

而他们的打开副本php://stdinphp://stdoutphp://stderr 也无法输出内容到http浏览器,经测试:写入php://stderr的内容将会输入到默认站点的错误日志中,其它两种无任何效果。

STDIN/STDOUT/STDERR简介:

原始流流打开副本描述
STDINphp://stdin标准输入(standard input),只读,用于从控制台输入内容;
STDOUTphp://stdout标准输出(standard output),只写,用于向控制台输出正常信息
STDERRphp://stderr错误输出(standard error),只写,用于向控制台输出错误信息

官方推荐使用常量 STDIN、 STDOUT 和 STDERR 来代替它们手动打开的副本封装器php://stdinphp://stdoutphp://stderr

【推荐学习:PHP教程

二、PHP STDIN用法

PHP语言中STDIN用于从控制台读取内容,遇到此常量或者通过fopen()函数打开PHP://stdin脚本将会等待用户输入内容,直到用户按下回车键提交。

写个stdin.PHP测试一下:

<?PHP
echo 请输入内容:;
$jimmy = fgets(STDIN);
echo sprintf(输入的内容为: %s\n, $jimmy);
 
$demo = fopen('PHP://stdin', 'r');
echo 请输入: ;
$test = fread($demo, 12); //最多读取12个字符
echo sprintf(输入为: %s\n, $test);
fclose($demo);

运行结果:

请输入内容:sad
输入的内容为: sad

请输入: asdasdasdasdasdasd
输入为: asdasdasdasd(这里因为设置了最多读取12个字符,设置更多一些就可以完整显示

三、PHP STDOUT用法

PHP语言中STDOUT用于向控制台输出标准信息;向此常量、或者向fopen()函数打开的PHP://stdout写入的内容将直接输出到控制台的标准输出;标准输出内容可以用过>或者1>重定向到指定地方,比如文件

同理我们写个文件来测试一下

<?PHP
fwrite(STDOUT, 通过STDOUT写入;\n);
 
$demo = fopen(PHP://stdout, w);
fwrite($demo, 通过PHP://stdout写入;);
fclose($demo);

运行一下:

☁  test  PHP demo.PHP > a.txt
☁  test  cat a.txt
通过STDOUT写入;
通过PHP://stdout写入;% 

☁  test  PHP demo.PHP
通过STDOUT写入;
通过PHP://stdout写入;% 
☁  test

四、PHP STDERR用法

PHP语言中STDERR用于向控制台输出错误信息;向常量、或者向fopen()函数打开的PHP://stderr写入的内容将直接输出到控制台的错误输出错误输出内容可以用过2>重定向到指定地方,比如文件;也可以使用2>&1错误输出定向到标准输出,与标准输出合并。

我们测试一下

<?PHP
fwrite(STDERR, STDERR写入的错误输出;\n);
 
fwrite(STDOUT, STDOUT写入的正常输出;\n);

$stdout = fopen(PHP://stdout, w);
fwrite($stdout, PHP://stdout写入的正常输出;\n);
fclose($stdout);

$stderr = fopen(PHP://stderr, w);
fwrite($stderr, PHP://stderr写入的错误输出;\n);
fclose($stderr);

正常输出错误输出分别定向到不同文件

☁  test  PHP demo.PHP 1>demo.ok 2>demo.err
☁  test   cat demo.ok
STDOUT写入的正常输出PHP://stdout写入的正常输出;
☁  test   cat demo.err
STDERR写入的错误输出PHP://stderr写入的错误输出

正常输出错误输出合并定向到统一文件

☁  test  PHP demo.PHP 1>AllInOne 2>&1
☁  test  cat AllInOne
STDERR写入的错误输出;
STDOUT写入的正常输出PHP://stdout写入的正常输出PHP://stderr写入的错误输出

好了,接下来可以去Sphere Online Judge叱咤风云了,先测试个demo题目

写个代码

<?PHP
    // your code here
$x=0;
while($x!=42){
   $x = fgets(STDIN);
   if($x!=42){
   echo sprintf(%d\n,$x);
}
}
?>

提交

哈哈哈哈,完全ok,再也不用限制于java和c了,我可以用PHP挑战一些题目了,大家也可以去试试?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐