为什么计算机打印的值超出了pascal字符串的范围?

为什么计算机打印的值超出了pascal字符串的范围?,pascal,freepascal,Pascal,Freepascal,我用pascal编程语言编写了以下代码 Program practice; //**** Function to get back N characters from a P position from a given string Function get_char(s1:String;n,p :Integer): String; Var temp : String; i : Integer; Begin temp:= s1[p]; For i:= p+1 To p+n-1

我用pascal编程语言编写了以下代码

Program practice;
    //**** Function to get back N characters from a P position from a given string

  Function get_char(s1:String;n,p :Integer): String;
 Var
temp : String;
i : Integer;
Begin
temp:= s1[p];
 For i:= p+1 To p+n-1 Do
    temp := temp + s1[i];
get_char := temp;
End;
//**** end of the function *****
Var
  s1,s2: String;
  n,p: Integer;
Begin
    Write('Enter the number of char:');
    readln(n);
    write('Enter the position:' );
    readln(p);
    write('Enter the string : ');
    readln(s1);
    write(get_char(s1,n,p));
Readkey;
End.
知道这个函数从字符串中的某个位置返回用户给定的一定数量的字符。 例如,当p=1和n=2时,结果为“he”。 现在假设p是3,n=4,那么函数的输出将是'lloA'。
所以我的问题是在这种情况下发生了什么,或者为什么我们会得到这样的结果?如果它与内存有关,请提供详细信息。

当函数读取字符串末尾以外的字符时,它会读取恰好位于这些内存位置的内存内容,并将该内存内容解释为字符。超出字符串长度的内存内容没有定义,也不可预测。某些编译器将显式Char0添加为终止字符。此零字符不包括在字符串长度中

为了防止函数返回错误的值,您可以

在编译器设置中启用范围检查,这将引发运行时错误


b检查p+n-1当函数读取字符串末尾以外的字符时,它读取恰好位于这些内存位置的内存内容,并将该内存内容解释为字符。超出字符串长度的内存内容没有定义,也不可预测。某些编译器将显式Char0添加为终止字符。此零字符不包括在字符串长度中

为了防止函数返回错误的值,您可以

在编译器设置中启用范围检查,这将引发运行时错误


b检查p+n-1@TomBrunberg是否给了您一个更一般的答案,但是您的代码中一个特别突出的问题是temp:=s1[p]不能解释s1为空的情况。您的函数基本上是模仿“copy”函数,尽管“n”的值不同。您应该检查p+n-1不大于长度s1,在这种情况下,“while”循环比“for”循环更好。这也会检测到长度s1=0的情况,如MartynA所示。@TomBrunberg给了您一个更一般的答案,但您的代码中一个特别突出的问题是,temp:=s1[p]不能解释s1为空的情况。您的函数基本上模仿了“复制”函数,尽管“n”的值不同。您应该检查p+n-1不大于长度s1,在这种情况下,“while”循环比“for”循环更好。这也将检测长度s1=0的情况,如MartynA所示。