西雅图德尔福(S10)。 Win32项目。
昨天,我的旧常规结果不对。 我找到了这一行:
<?php
$page = $_GET['page'];
$cookiename = "emp";
// GET COOKIE TO NOT OVERWRITE.
$cookie = isset($_COOKIE[$cookiename]) ? unserialize($_COOKIE[$cookiename]) : [];
if (isset($_GET['check_list']) ) {
$cookie[$page] = $_GET['check_list'];
setcookie($cookiename , serialize($cookie), time()+(86400/86400*30) );
}
?>
//to print the values
<?php
if (isset($_COOKIE[$cookiename]) ) {
print_r(unserialize($_COOKIE[$cookiename]));
}
?>
aSQLText为'CREATE',并且p = 1。
sPre获得“ C”结果。
嗯...然后我写信观看窗口:
sPre := Copy(aSQLText, p - 1, 1);
结果为“ A” ...
哎呀...什么???
该副本可以很好地处理溢出。 但是不是一开始吗?还是什么?
我希望我没有在字符串之前指向的任何代码。
您在Delphi中也得到了这个结果吗? 为什么?
据我所知,字符串内部存储为4字节长+字符串;和他们 基于1(不是任何数组为0)。这是错误吗?
答案 0 :(得分:4)
在代码中进行复制的调用已从 System.pas 解析为内部函数_UStrCopy
。在其实施之初,它会检查 Index 和 Count 参数,并在必要时进行更正。这包括强制 Index 指向太低的第一个字符。
我同意应该对此进行记录。
答案 1 :(得分:0)
用于复制的documentation未指定在这种情况下会发生什么,因此我不会将其本身称为Bug。
我可以看到两个解决方案的参数(为空字符串或以空字符串为起始位置)。
要点是,因为在文档中没有定义在这种情况下会发生什么,所以程序以一种或另一种方式承担任何事情是不明智的,因为它可能取决于实现,甚至可能随着不同版本的变化而变化。 。如果您的代码可能冒p = 1(甚至p = 0)的风险,并且在这种情况下您想要空字符串,则应该显式地编写代码以达到这种效果,而不是依赖(错误的)期望(在这种情况下)编译器可能会这样做:
if p<=1 then sPre:='' else sPre := Copy(aSQLText, p - 1, 1);