当我的字符串包含 #0 个字符时,为什么 ShowMessage 会给出意外的输出?
Why does ShowMessage give unexpected output when my string contains #0 characters?
今天我偶然发现了一些神秘的东西。这行代码:
showmessage(menuMain.player[2] + ' ready!');
生成此消息(例如 menuMain.player[2] = 玩家):
Player
但是如果我这样写代码(例如 menuMain.player[2] = Player):
showmessage('Test: ' + menuMain.player[2]);
它将生成此消息:
Test: Player
根据调试器,字符串(buffer := menuMain.player[2] + ' ready!')
的准确值是这样的:
'Player'#0#0#0#0#0#0#0#0' ready!'
老实说,我确实相信这是一个编译器故障,因为我在另一个代码块中有 完全相同的 行,并且它可以完美运行。
现在对我来说最困难的部分是我是愚蠢的,还是这确实是一个小故障?
the exact value of buffer string (buffer = menuMain.player[2] + ' ready!'): 'Player'#0#0#0#0#0#0#0#0' ready!'
问题是嵌入的空字符 (#0
)。这些字符充当字符串终止符,这意味着大多数 WinAPI 函数(包括那些输出或绘制文本的函数)在该点停止处理字符串。当找到第一个 #0
时,字符串被认为已经结束。
您自己可以很容易地进行测试,使用如下代码:
var
TestStr: string;
begin
TestStr := 'This is a test';
ShowMessage(TestStr); // Outputs This is a test
TestStr[5] := #0;
ShowMessage(TestStr); // Outputs This
end;
当然,剩下的问题是您最初是如何得到这些嵌入的空值的?由于您尚未发布填充 menuMain.player
的代码,因此无法确定,但这就是您需要检查的区域,因为 Delphi 中的字符串数组元素本身不包含空值。您也可以自己检查一下:
var
TestArr: array[1..2] of string;
begin
TestArr[1] := 'Player one';
TestArr[2] := 'Player two';
ShowMessage(TestArr[1] + ' defeated ' + TestArr[2]);
end;
所以你问题的答案
Now the tough part for me, is that me being dumb, or this is indeed a glitch?
这是一个故障,但故障在您的代码中的某处。这不是 Delphi 或其字符串中的故障。
今天我偶然发现了一些神秘的东西。这行代码:
showmessage(menuMain.player[2] + ' ready!');
生成此消息(例如 menuMain.player[2] = 玩家):
Player
但是如果我这样写代码(例如 menuMain.player[2] = Player):
showmessage('Test: ' + menuMain.player[2]);
它将生成此消息:
Test: Player
根据调试器,字符串(buffer := menuMain.player[2] + ' ready!')
的准确值是这样的:
'Player'#0#0#0#0#0#0#0#0' ready!'
老实说,我确实相信这是一个编译器故障,因为我在另一个代码块中有 完全相同的 行,并且它可以完美运行。
现在对我来说最困难的部分是我是愚蠢的,还是这确实是一个小故障?
the exact value of buffer string (buffer = menuMain.player[2] + ' ready!'): 'Player'#0#0#0#0#0#0#0#0' ready!'
问题是嵌入的空字符 (#0
)。这些字符充当字符串终止符,这意味着大多数 WinAPI 函数(包括那些输出或绘制文本的函数)在该点停止处理字符串。当找到第一个 #0
时,字符串被认为已经结束。
您自己可以很容易地进行测试,使用如下代码:
var
TestStr: string;
begin
TestStr := 'This is a test';
ShowMessage(TestStr); // Outputs This is a test
TestStr[5] := #0;
ShowMessage(TestStr); // Outputs This
end;
当然,剩下的问题是您最初是如何得到这些嵌入的空值的?由于您尚未发布填充 menuMain.player
的代码,因此无法确定,但这就是您需要检查的区域,因为 Delphi 中的字符串数组元素本身不包含空值。您也可以自己检查一下:
var
TestArr: array[1..2] of string;
begin
TestArr[1] := 'Player one';
TestArr[2] := 'Player two';
ShowMessage(TestArr[1] + ' defeated ' + TestArr[2]);
end;
所以你问题的答案
Now the tough part for me, is that me being dumb, or this is indeed a glitch?
这是一个故障,但故障在您的代码中的某处。这不是 Delphi 或其字符串中的故障。