为相同的PHP代码获得不同的输出


Getting different output for same PHP code

(由于比赛结束,我无法访问问题,因此无法粘贴确切的问题。对不起。)

你好,最近我参加了一个编程比赛(PHP)。我在我的PC上测试了代码,得到了想要的输出,但是当我在比赛网站和ideone上检查我的代码时,我得到了错误的输出。这是第二次发生同样的事情了。相同的PHP代码,但输出不同。

它从命令行接受输入。目的是带来连接字符'A','B','C',' A','B','C'的子字符串。

示例:考虑字符串'AaBbCc'作为CLI输入。子:一,A, B, B, C, C, Aa,艺术展,AaBb, AaBbC, AaBbCc, aB, aBb, aBbC, aBbCc, Bb, BbC, BbCc,公元前bCc、Cc。

子字符串总数:21,这是正确的输出。

我的机器:

Windows 7 64位PHP 5.3.13 (Wamp Server)

代码如下:

<?php
$stdin = fopen('php://stdin', 'r');
    while(true) {
        $t = fread($stdin,3);
        $t = trim($t);
        $t = (int)$t;
        while($t--) {
            $sLen=0;
            $subStringsNum=0;
            $searchString="";
            $searchString = fread($stdin,20);
            $sLen=strlen($searchString);
            $sLen=strlen(trim($searchString));
            for($i=0;$i<$sLen;$i++) {
                for($j=$i;$j<$sLen;$j++) {                  
                    if(preg_match("/^[A-C]+$/i",substr($searchString,$i,$sLen-$j))) {$subStringsNum++;}
                }
            }
            echo $subStringsNum."'n";
        }
        die;
    }
?>
Input:
2
AaBbCc
XxYyZz
Correct Output (My PC):
21
0
Ideone/Contest Website Output:
20
0

您必须记住,您的代码也在处理换行符。

在Windows系统上,换行符由两个字符组成,转义表示为'r'n

在UNIX系统(包括Linux)上,只使用'n,在MAC上使用'r

由于您依赖于标准输出,它将容易受到这些体系结构差异的影响,即使它是一个文件,您在创建文件句柄时通过使用标志"r"而不是"rb"来强制执行体系结构标准,显式声明您不想以二进制安全模式读取文件。

你可以在Ideone.com版本的代码中看到,当你强制使用主系统使用的换行符时,PHP脚本会给出预期的输出,而在使用UNIX换行符的另一个版本中,它会给出"错误"的输出。

我想你应该使用fgets()分别读取每个字符串,而不是fread(),然后trim()它们在处理之前删除这些字符。

我试着分析这段代码,这就是我所知道的:

  1. 似乎输入字符串没有问题。如果有的话,就不可能返回结果20

  2. 我不认为循环有任何问题,我通常使用预增量,但它不应该影响结果

对我来说,只有两种可能会导致意想不到的结果:

  1. 其中一个循环迭代没有执行-它可能只是最后一个内部循环(当$i == 5$j == 5时,因为这个循环只运行一次),所以它将匹配21和20之间的差值。

  2. preg_match在其中一次出现时不会匹配此字符串(preg_match有21次检查,其中一个-可能最后一个不匹配)。

如果我必须选择,我会选择第一个可能的原因。如果我是你,我会联系概念作者,询问他们关于版本和测试其他代码的可能性。在这种情况下,最重要的是preg_match()总共启动了多少次——20次还是21次(使用简单的echo或额外的计数器会告诉我们),以及preg_match()检查的字符串是什么。只有这样,你才能发现为什么这段代码在我看来不起作用。

如果您了解更多情况,请告诉我,那就太好了。

p。当然我也得到了结果21所以很难说哪里出错了