Delphi:奇怪的子字符串结果

时间:2019-06-06 07:09:26

标签: string delphi copy substring

西雅图德尔福(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)。这是错误吗?

2 个答案:

答案 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);