(由于比赛结束,我无法访问问题,因此无法粘贴确切的问题。对不起。)
你好,最近我参加了一个编程比赛(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()
它们在处理之前删除这些字符。
我试着分析这段代码,这就是我所知道的:
-
似乎输入字符串没有问题。如果有的话,就不可能返回结果20
-
我不认为循环有任何问题,我通常使用预增量,但它不应该影响结果
对我来说,只有两种可能会导致意想不到的结果:
-
其中一个循环迭代没有执行-它可能只是最后一个内部循环(当
$i == 5
和$j == 5
时,因为这个循环只运行一次),所以它将匹配21和20之间的差值。 -
preg_match
在其中一次出现时不会匹配此字符串(preg_match
有21次检查,其中一个-可能最后一个不匹配)。
如果我必须选择,我会选择第一个可能的原因。如果我是你,我会联系概念作者,询问他们关于版本和测试其他代码的可能性。在这种情况下,最重要的是preg_match()
总共启动了多少次——20次还是21次(使用简单的echo或额外的计数器会告诉我们),以及preg_match()
检查的字符串是什么。只有这样,你才能发现为什么这段代码在我看来不起作用。
p。当然我也得到了结果21所以很难说哪里出错了