(比赛结束时无法粘贴确切的问题,我无法访问该问题。抱歉。)
您好,最近我参加了编程竞赛(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
答案 0 :(得分:0)
我试图分析这段代码以及我所知道的:
输入字符串似乎没有问题。如果有的话就不可能返回结果20
我没有看到循环有任何问题,我通常会使用预增量,但它根本不会影响结果
我只有两种可能会导致意外结果:
其中一个循环迭代没有被执行 - 它可能只是最后一个内循环(当$i == 5
然后$j == 5
时因为这个循环只运行一次)所以它将匹配21和20之间的差异。
preg_match
在其中一个匹配项中不匹配此字符串(有preg_match
的21个检查,其中一个 - 可能是最后一个不匹配)
如果我不得不选择,我会选择第一个可能的原因。如果我是你,我会联系概念作者并询问他们关于测试其他代码的版本和可能性。在这种情况下,最重要的是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}}来读取每个字符串,以便在处理之前删除这些字符。