使用 PHP A 题 PHP 的标准输入输出流

最近一直在准备php的实习生面试,所以也需要A一些笔试题,在赛码网,牛客网上面看见,A题有php的选项了,特别高兴,毕竟之前一直都是使用C++来A题

但是php我们经常用来做web,命令行运行其实挺少见的,所以自己对php的标准输入与输出流也不是非常的清楚,于是我就查阅了一下,发现讲如何用php来A题的帖子非常少,所以就打算把自己学习的经验分享给大家

  • STDIN 是php 标准输入流 我们所以 fgets(STDIN) 即可向命令行输入

    但是 fgets(STDIN) 有一个致命的缺点,就是当它遇到换行符(包括在返回值中)、EOF 就会停止

<?php

$arr[]= fgets(STDIN);

var_dump($arr);
输入5  就会立马停止 如下面所示
C:\wamp64\www\data\array>php array.php
5
array(1) {
  [0]=>
  string(3) "5
  "
}

这时如果有细心的就会发现,明明我输入的是5,为什么打印出来的是string(3) "5" 5应该只算一个字符啊,其实这是因为我们结束输入换行时,系统默认加入了 \n 这两个字符,我们从" 被换行也可以看出这一点

下面我们尝试使用 trim 函数来尝试去除\n 换行符看是否有效

<?php

$arr[]=  trim(fgets(STDIN));

var_dump($arr);

还是输入5

C:\wamp64\www\data\array>php array.php
5
array(1) {
  [0]=>
  string(1) "5"
}

完美解决了,标准输入输出带换行的问题


  • 但是我们A题的时候输入不可能,每次输入都让我们换行,偶尔也会出现一行输入的问题

    如下面的输入

拿简单的排序题目来举例
输入数组大小n
在依次输入数组元素
输出数组升序的结果

输入输出用例
输入
5
2 3 1 4 5
输出
1 2 3 4 5

在用c++的方法来输入,如下

<?php

$n= trim(fgets(STDIN));

for ($i=0;$i<$n;$i++)
{
    $arr[$i]=  trim(fgets(STDIN));
}

var_dump($arr);

但是结果会如下

C:\wamp64\www\data\array>php array.php
5
1 2 3 4 5
1
1
1
1
array(5) {
  [0]=>
  string(9) "1 2 3 4 5"
  [1]=>
  string(1) "1"
  [2]=>
  string(1) "1"
  [3]=>
  string(1) "1"
  [4]=>
  string(1) "1"
}

会发现 ,换行之后我们还要输出,不能实现完美的和用例一样的输入

经过多番的查找之后终于发现了一个靠谱的方法可以解决这个问题使用 explode 函数把空格分割

我们只需要 输入 1 2 3 4 5就会自动变成 一个以1 2 3 4 5 为元素的数组

具体效果如下

<?php

$n= trim(fgets(STDIN));

$arr = explode(" ", trim(fgets(STDIN)));

var_dump($arr);

结果为

C:\wamp64\www\data\array>php array.php
5
5 4 3 2 1
array(5) {
  [0]=>
  string(1) "5"
  [1]=>
  string(1) "4"
  [2]=>
  string(1) "3"
  [3]=>
  string(1) "2"
  [4]=>
  string(1) "1"
}

完美解决了我们的问题


下面我们试试在赛码网A题

file


file

完美A题成功

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 1

fileScreen Shot 2019-11-01 at 9.40.54 PM.png
这里的$n,没用上啊,怎么根据这个$n限制一行输入字符的个数?

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!