获取相同PHP代码的不同输出

时间:2014-07-19 19:43:14

标签: php

(比赛结束时无法粘贴确切的问题,我无法访问该问题。抱歉。)

您好,最近我参加了编程竞赛(PHP)。我在我的电脑上测试了代码并获得了所需的输出,但是当我在比赛网站和ideone上检查我的代码时,输​​出错误了。这是第二次发生同样的事情。相同的PHP代码,但输出不同。

从命令行获取输入。目的是带来与字符联系的子字符串' A' B'' C''''''' b'' C'

例如:考虑字符串' AaBbCc'作为CLI输入。 子串:A,a,B,b,C,c,Aa,AaB,AaBb,AaBbC,AaBbCc,aB,aBb,aBbC,aBbCc,Bb,BbC,BbCc,bC,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

2 个答案:

答案 0 :(得分:0)

我试图分析这段代码以及我所知道的:

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

  2. 我没有看到循环有任何问题,我通常会使用预增量,但它根本不会影响结果

  3. 我只有两种可能会导致意外结果:

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

    2. preg_match在其中一个匹配项中不匹配此字符串(有preg_match的21个检查,其中一个 - 可能是最后一个不匹配)

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

      如果您在发现更多信息时可以在此处输入任何信息,那将是很好的。

      PS。当然我也得到了结果21所以很难说出什么可能是错的

答案 1 :(得分:0)

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

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

在包括Linux的UNIX系统上,仅使用\n,而在MAC上,它们使用\r代替。

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

您可以在this Ideone.com version of your code中看到当您强制执行家庭系统使用的换行符号时,PHP脚本将如何提供预期输出,而在this other version using UNIX newlines中它会给出错误&#34;错误& #34;输出

我认为你应该使用fgets()来代替fread()而不是trim()而是{{1}}来读取每个字符串,以便在处理之前删除这些字符。