我用的是Windows 11. 当我在Windows PowerShell中执行一个PHP文件时,我没有结果与会者.

例如:

<?php
fscanf(STDIN,"%d",$x);
$tab=array();
for ($i=0;$i<$x;$i++){
    $row = stream_get_line(STDIN,6+1,"\n");
    $tab[] = $row.(strrev($row));
}
echo("\n");
foreach ($tab as $x){
echo($x."\n");
}
foreach (array_reverse($tab) as $x){
    echo($x."\n");
}

结果是

PS C:\wamp64\www\> php tablereverse.php
2
ab
bb

ba
bb
bb
ba

but if I run the file with PHPStorm 结果是

C:\wamp64\bin\php\php8.1.13\php.exe C:\wamp64\www\tableReverse.php
2
ab
bb

abba
bbbb
bbbb
abba

我使用相同的PHP路径

PS C:\wamp64\www\> php -v
PHP 8.1.13 (cli) (built: Nov 22 2022 15:49:14) (ZTS Visual C++ 2019 x64)
Copyright (c) The PHP Group
Zend Engine v4.1.13, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.13, Copyright (c), by Zend Technologies

推荐答案

由于历史原因,我们在新行中涉及两个字符,这两个字符最初表示teletype个回车(滑动打印头)可以执行的两个不同动作:

  • 回车符(根据语言表示为CR\r)会将回车符移动到第一列(水平移动).

  • 换行符(LF\n)会将回车移到下一行(垂直移动)

操作系统采用了不同的约定来表示新的行:

  • Unix Select 了\n
  • 微软 Select 了\r\n
  • 苹果 Select 了\r(并最终在很久之后切换到了\n).

您正在将\n设置为分隔符:

stream_get_line(STDIN,6+1,"\n");

但Windows程序通常使用\r\n.这意味着您要反转的字符串包含尾随的\r字符,并且根据用于display它的软件的不同,您可能会看到不同的结果:

  • 实际的回程
  • 隐藏的人物
  • 光标移至行首

这里发生的情况是,PowerShell、命令提示符(又名CMD)和运行两者的PhpStorm终端面板都会将ab\rba内的\r呈现为回车符,因此在打印前两个字母后,光标会向后移动,接下来的字母会覆盖该行中已经打印的内容.另一方面,PhpStorm的"Run"功能实现了自己的终端仿真器,其行为是隐藏的角色.

如果添加一些调试信息和唯一的输入字符串,则可以更好地发现这一点:

一种可能的解决方案是切换到fgets(),它可以理解所有样式,并自己go 掉换行符:

$row = rtrim(fgets(STDIN, 6 + 1));

Php相关问答推荐

添加自定义Metabox到WooCommerce管理订单,启用HPOS

dockerized laravel服务器拒绝POST请求

如何限制WordPress自定义分类术语页面中的术语数量

ForHumans函数中的月当量与单位限制

如何将隐式乘法添加到PHPPEG基本计算器语法中?

如何在WooCommerce产品子类别中显示特定内容

Apache只允许index.php-不从根目录工作

这是在可召回的背景下吗?

返回WooCommerce中的所有已启用变体

WooCommerce在收据页面获取产品下载URL

在WooCommerce Admin产品列表自定义列中显示来自元数据的统计数据

向WooCommerce管理订单总额添加自定义总额行

从WooCommerce管理订单汇总中隐藏原始小计行

表单提交返回空白页

关于Laravel缓存出现的错误

在 groupBy laravel 5.7 中 Select 多列

在 Laravel、Vuejs 和 Inertia 中配置 TypeScript 的问题

PDO 和 SQL 查询结果中日期格式不同的原因可能是什么?

Symfony 6 中的入口点 (public/index.php) - 它是如何工作的?

Symfony 自定义注销