• 技术文章 >后端开发 >php教程

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

    藏色散人藏色散人2021-04-02 08:57:43转载255

    用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挑战一些题目了,大家也可以去试试?

    以上就是我可以用PHP挑战在线编程题了!的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:segmentfault,如有侵犯,请联系admin@php.cn删除
    专题推荐:php
    上一篇:详解PHP通过ICMP协议实现ping(原始套接字) 下一篇:PHP中匿名函数的使用技巧
    第15期线上培训班

    相关文章推荐

    • thinkphp6如何配置环境变量• php中如何计算程序运行时间• 如何区分PHP中unset,array_splice的区别• 如何解决PHP配置文件中 save_handler 修改不生效

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网