Delphi XE3 - 无法连接字符串

5

我真的无法将两个(/三个)字符串连接起来。这些是我尝试过的一些代码:

dir := 'C:\Users\' + Username + '\Downloads\done.txt'; //"Username" is the computer's current username.
//another example vvv
dir := 'C:\Users\' + Username;
dir := dir + '\Downloads\done.txt';
//last example vvv
dir := Concat('C:\Users\', Username, '\Downloads\done.txt');

所有的示例都返回相同的结果:

C:\Users\-用户名-

而不是:

C:\Users\-用户名-\Downloads\done.txt

我在这里做错了什么?

2
Delphi的字符串连接是有效的。您提供的代码并没有产生您所说的输出。请提供一个完整的程序以重现此行为。 - David Heffernan
1个回答

16

我的猜测是你的Username变量在末尾包含#0,并且你正在将该变量输出到某个Windows API函数。例如,以下代码将导致此错误行为:

// C++ code
char Username[256] = "JohnDoe";
// add null terminator at the end of the string
Username[strlen(Username)] = 0;
// output to a certain Windows API function
SomeAPIFunction(Username);
procedure TForm1.Button1Click(Sender: TObject);
var
  Dir: string;
  Username: string;
begin
  Username := 'Username' + #0;
  Dir := Concat('C:\Users\', Username, '\Downloads\done.txt');
  ShowMessage(Dir);
end;

我的建议是检查您的用户名变量的值,并在末尾存在多余的#0时将其删除。


谢谢,它是以空终止字符结尾的。当我可以接受这个答案时(2分钟),我会接受它。 - user1580845
6
让RTL删除它,或者使用以下语句:Concat('C:\Users\', PChar(Username), ...); - Sertac Akyuz
1
@Sertac,我还没有建议如何删除那个空终止符,但是PChar类型转换很有效。感谢你的提示! - TLama
9
更好的选择是找出为什么“用户名”中首先包含一个错误的“#0”字符,然后修复那个逻辑,而不是采用其他方案。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接