用PHP挑戰在線編程題

今天想在Sphere Online Judge中用PHP來在線挑戰一些題目,要用到標準輸入輸出,但最近在寫php又不想用c來寫,平時寫項目都是表單提交,還真沒有考慮過這個,因而看了下文檔。php

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

1、PHP STDIN、STDOUT、STDERR簡介: 

STDINSTDOUTSTDERR命令輸入輸出流,用於向控制檯(linux shell終端、windows cmd終端)輸入、輸出內容,它們默認是已經打開的,能夠直接對他們進行讀寫操做,它們只能在CLI(command-line interface,命令行界面)模式中使用,在Http模式時,它們是未定義的。linux

而他們的打開副本php://stdinphp://stdoutphp://stderr 也沒法輸出內容到http瀏覽器,經測試:寫入php://stderr的內容將會輸入到默認站點的錯誤日誌中,其它兩種無任何效果。shell

STDIN/STDOUT/STDERR簡介:windows

原始流 流打開副本 描述
STDIN php://stdin 標準輸入(standard input),只讀,用於從控制檯輸入內容;
STDOUT php://stdout 標準輸出(standard output),只寫,用於向控制檯輸出正常信息
STDERR php://stderr 錯誤輸出(standard error),只寫,用於向控制檯輸出錯誤信息

  官方推薦使用常量 STDIN、 STDOUT 和 STDERR 來代替它們手動打開的副本封裝器php://stdinphp://stdoutphp://stderr瀏覽器

2、PHP STDIN用法:

PHP語言中"STDIN"用於從控制檯讀取內容,遇到此常量或者經過fopen()函數打開php://stdin腳本將會等待用戶輸入內容,直到用戶按下回車鍵提交。app

寫個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個字符,設置更多一些就能夠完整顯示)

3、PHP STDOUT用法:

 PHP語言中STDOUT用於向控制檯輸出標準信息;向此常量、或者向fopen()函數打開的php://stdout寫入的內容將直接輸出到控制檯的標準輸出;標準輸出的內容能夠用過">"或者"1>"重定向到指定地方,好比文件。spa

同理咱們寫個文件來測試一下

<?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

4、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挑戰一些題目了,你們也能夠去試試?

我的訂閱號

Jimmy的技術樂園

相關文章
相關標籤/搜索