Free为什么计算机打印的值超出了帕斯卡字符串的范围?



在帕斯卡编程语言中,我写了以下代码

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 的"hello",结果将是"he"。 现在假设 p 是 3 并且 n = 4,那么函数的输出将是 'lloA'。 所以我的问题是在这种情况下会发生什么,或者为什么我们会得到这样的结果?(如果与记忆有关,请给我详细信息(。

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

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

  • a( 在编译器设置中打开范围检查,这将引发运行时错误

  • b( 检查p + n - 1 <= Length(s),如果没有,请将读数限制为长度。

选择选项 b 可以自由读取,直到任何字符串的末尾,方法是传递参数pMaxInt

最新更新